当前位置:   article > 正文

C/C++ | g++ 编译指定了链接库路径,仍报错找不到函数:Undefined reference_g++编译时,调用opencv函数,编译时说找不到相关函数

g++编译时,调用opencv函数,编译时说找不到相关函数

 

题外话:这次是被编译顺序坑了很久。。。还是基础学的不扎实

 

实验背景:用g++编译cpp文件,依赖于opencv。待编译的cpp文件cv_test.cpp内容如下:

  1. #include "opencv2/core/mat.hpp"
  2. int main()
  3. {
  4. cv::Mat mat;
  5. return 0;
  6. }

该文件仅用于测试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++编译命令中的重要性。

  1. $ g++ -c b.cpp -o b.o
  2. $ ar cr libb.a b.o
  3. $ g++ -c d.cpp -o d.o
  4. $ ar cr libd.a d.o
  5. $ g++ -L. -ld -lb a.cpp # 错误顺序
  6. $ g++ -L. -lb -ld a.cpp # 错误顺序
  7. $ g++ a.cpp -L. -ld -lb # 错误顺序
  8. $ 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命令之后无报错信息,找到了指定库。

 

 

预祝大家编译顺利~!

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/201069?site
推荐阅读
相关标签
  

闽ICP备14008679号