C/C++ | g++ 编译指定了链接库路径,仍报错找不到函数:Undefined reference

 

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

 

实验背景:用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命令之后无报错信息,找到了指定库。

 

 

预祝大家编译顺利~!

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux下编译报错"undefined reference to `main'"通常是由于缺少main函数引起的。main函数是C/C++程序的入口函数编译器在链接阶段会查main函数作为程序的起点。如果不到main函数,就会报错"undefined reference to `main'"。 可能的原因和解决方法如下: 1. 检查源代码文件是否包含了正确的main函数,并确保函数签名正确。C程序的main函数应该是`int main(void)`或者`int main(int argc, char *argv[])`,C++程序的main函数应该是`int main()`或者`int main(int argc, char *argv[])`。 2. 确保源代码文件的文件名后缀符合编译器的要求。C程序的源代码文件通常使用`.c`后缀,C++程序的源代码文件通常使用`.cpp`或`.cc`后缀。 3. 确保编译命令正确。在使用gcc或g++编译,需要将源代码文件作为参数传递给编译器,并使用`-o`选项指定输出文件名。例如,对于C程序,可以使用以下命令进行编译:`gcc -o output_file source_file.c`;对于C++程序,可以使用以下命令进行编译:`g++ -o output_file source_file.cpp`。 4. 如果使用了多个源代码文件,确保所有的源代码文件都被包含在编译命令中。例如,对于C程序,可以使用以下命令进行编译:`gcc -o output_file source_file1.c source_file2.c`;对于C++程序,可以使用以下命令进行编译:`g++ -o output_file source_file1.cpp source_file2.cpp`。 如果以上方法都没有解决问题,可能是编译器或链接器的配置有误,可以尝试重新安装编译器或检查相关配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值