如何修复Ubuntu 16.04下链接器的路径错误?
我之前在Ubuntu 16.04上编译依赖OpenCV的项目时也碰到过类似的链接路径问题,给你几个实操的排查和解决方向:
1. 先确认pkg-config返回的OpenCV配置是否靠谱
先手动跑一下pkg-config --libs opencv(如果是OpenCV3及以上版本,可能需要换成pkg-config --libs opencv3),看看输出的链接参数里有没有正确指向你的libjpeg库路径。正常应该能看到类似-L/usr/lib/x86_64-linux-gnu -ljpeg或者你自定义安装libjpeg的路径。
如果输出里完全没提libjpeg,或者路径不对,那问题大概率出在opencv的pkg-config配置文件上。
你可以用pkg-config --variable=prefix opencv找到OpenCV的安装前缀,然后去${prefix}/lib/pkgconfig/opencv.pc这个路径打开配置文件,检查Libs字段,确认是否包含了libjpeg的链接路径和库名。如果没有,手动补上-L/path/to/your/libjpeg/lib -ljpeg就行。
2. 排查链接器的路径优先级问题
有时候链接器会优先搜系统默认路径里的旧版本/不兼容库,而忽略pkg-config指定的路径。你可以在Makefile里直接把pkg-config的输出展开到链接参数里,比如:
LDFLAGS += $(shell pkg-config --libs opencv)
如果是用cmake构建的项目,记得重新跑一遍cmake生成新的Makefile,确保链接命令里的自定义路径排在前面——链接器是按顺序搜库的,前面的路径优先级更高。
另外也可以临时用环境变量覆盖测试:
LD_LIBRARY_PATH=/path/to/your/libjpeg/lib make
如果这样能编译成功,说明是系统库路径优先级的问题。要永久解决的话,把libjpeg的路径加到/etc/ld.so.conf.d/下新建的一个.conf文件里,然后执行sudo ldconfig更新缓存就行。
3. 确认OpenCV编译时是否正确关联了libjpeg
如果你的OpenCV是自己源码编译的,可能在cmake阶段没正确找到libjpeg,导致生成的配置里漏掉了这个依赖。重新跑cmake的时候加上这些参数:
cmake -DWITH_JPEG=ON -DJPEG_INCLUDE_DIR=/path/to/your/libjpeg/include -DJPEG_LIBRARY=/path/to/your/libjpeg/lib/libjpeg.so ..
然后重新编译安装OpenCV,这样生成的pkg-config配置就会自动带上libjpeg的链接信息。
4. 检查链接顺序是否搞反了
链接器是按从左到右的顺序处理库的,依赖库必须放在被依赖的库后面。比如你的代码依赖OpenCV,OpenCV又依赖libjpeg,那链接顺序得是-lopencv_core ... -ljpeg,不能反过来。如果是手动写的链接参数,调整下顺序试试;如果用pkg-config的输出,它会自动处理正确的顺序,尽量别手动改。
内容的提问来源于stack exchange,提问作者mathdonk

