Eclipse下CImg库链接错误排查求助(C++)
我之前也碰到过一模一样的情况!问题出在Eclipse的编译命令参数顺序上,虽然你已经正确配置了要链接的库,但Eclipse默认把库参数放在了源文件前面,这会让链接器找不到需要的符号。
先看你给出的错误编译命令:
g++ -O3 -Wall -std=c++11 -lX11 -L/usr/X11R6/lib -lm -pthread -MMD -MP -MF"src/per_iniziare.d" -MT"src/per_iniziare.d" -o "src/per_iniziare.o" "../src/per_iniziare.cpp"
注意到-lX11这些库参数在../src/per_iniziare.cpp之前,而你终端手动编译时是把库参数放在源文件之后的:g++ -O3 -o try main.cpp -L/usr/X11R6/lib -lm -lX11 -pthread——这才是正确的顺序,因为链接器是按顺序处理输入的,必须先编译源文件,再链接它依赖的库,否则链接器还没看到源文件里的符号引用,就先处理库了,自然会报未定义引用。
具体解决步骤:
- 右键你的Eclipse项目,选择Properties
- 展开左侧菜单的C/C++ Build > Settings,然后切换到GCC C++ Linker选项卡
- 先确认Libraries页面里已经添加了
X11、m、pthread这几个库(你已经配置过,但再检查一遍) - 关键操作:切换到Command Line Pattern标签页,修改默认的命令模板
- 默认模板大概是:
${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} - 把
${FLAGS}移到${INPUTS}后面,改成:${COMMAND} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} ${FLAGS}
- 默认模板大概是:
- 点击Apply and Close,然后执行Project > Clean,再重新Build项目
这样修改后,Eclipse生成的编译命令就会把库参数放到源文件后面,和你手动在终端执行的命令顺序一致,就能解决链接错误了。
附你的代码:
#include <iostream> #include<X11/Xlib.h> #include "CImg.h" using namespace cimg_library; int main() { // 读取jpg图像 CImg<float> imgin("frog.jpg"); CImg<float> black_white; // 对像素(R,G,B值)进行计算 for(int i=0; i<100; i++) for(int j=0; j<10; j++) imgin(i,i+j,0) = imgin(i,i+j,1) = imgin(i, i+j, 2) = 0; // 写回图像 imgin.save("frog2.jpg"); black_white = imgin.get_RGBtoYCbCr().get_channel(0); black_white.save("frog3.jpg"); return(0); }
以及报错信息:
g++ -O3 -Wall -std=c++11 -lX11 -L/usr/X11R6/lib -lm -pthread -MMD -MP -MF"src/per_iniziare.d" -MT"src/per_iniziare.d" -o "src/per_iniziare.o" "../src/per_iniziare.cpp"
/tmp/cc1l38bP.o: In functioncimg_library::CImgDisplay::paint(bool) [clone .part.18]': per_iniziare.cpp:(.text+0x4f2): undefined reference toXPutImage'
per_iniziare.cpp:(.text+0x625): undefined reference toXSendEvent' /tmp/cc1l38bP.o: In functioncimg_library::CImgDisplay::move(int, int) [clone .part.142]':
per_iniziare.cpp:(.text+0x101a): undefined reference to `XMoveWindow'
内容的提问来源于stack exchange,提问作者leqo

