赞
踩
题外话:这次是被编译顺序坑了很久。。。还是基础学的不扎实
实验背景:用g++编译cpp文件,依赖于opencv。待编译的cpp文件cv_test.cpp内容如下:
- #include "opencv2/core/mat.hpp"
-
- int main()
- {
- cv::Mat mat;
- return 0;
- }
该文件仅用于测试opencv链接库是否编译成功,同学们可以根据自己的情况修改内容。
g++编译的原(出错)脚本compie_test.sh如下:
g++ -I./opencv3/include -L./opencv3/lib -lopencv_core -lopencv_highgui cv_test.cpp -o cv_test
输入shell编译,报错:
sh compile_test.sh
报错信息提示找不到若干opencv的库:
In function `cv::Mat::release()':
cv_test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status
我们的脚本里已经指明opencv的库路径,但是仍然编译出错,提示若干cv函数都找不到。开启了漫漫搜索之路,最后:
原答案链接:why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc
我们发现在ubuntu18.04环境下,g++为7版本以上的时候,对编译顺序很敏感。具体解释见原文回答链接如上。
摘取重要的信息,需要注意顺序在g++编译命令中的重要性。
- $ g++ -c b.cpp -o b.o
- $ ar cr libb.a b.o
- $ g++ -c d.cpp -o d.o
- $ ar cr libd.a d.o
-
- $ g++ -L. -ld -lb a.cpp # 错误顺序
- $ g++ -L. -lb -ld a.cpp # 错误顺序
- $ g++ a.cpp -L. -ld -lb # 错误顺序
- $ g++ a.cpp -L. -lb -ld # 正确顺序 ***
解决方案:调整cpp在编译脚本中的顺序即可正确编译。
g++ -I./opencv3/include -L./opencv3/lib cv_test.cpp -lopencv_core -lopencv_highgui -o cv_test
再次shell命令之后无报错信息,找到了指定库。
预祝大家编译顺利~!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。