undefined reference问题总结
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:
关于undefined reference这样的问题,网上也有很多的说法,在此,我以详细地示例给出其中的各种原因说明以及解决方法,然后再给出我所遇到的与大家均不同的问题. 1. 链接时缺失了相关目标文件(.o) 测试代码如下:
然后编译.
得到两个 .o 文件,一个是 main.o,一个是 test.o ,然后我们链接 .o 得到可执行程序:
这时,你会发现,报错了:
这就是最典型的undefined reference错误,在链接时发现找不到某个函数的实现文件,本例中test.o文件中包含了test()函数的实现,如果按下面这种方式链接就没事了.
【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的. 拥有帝国一切,皆有可能。欢迎访问phome.net
需要改成如下形式才能成功,将test()函数的实现文件一起编译.
2. 链接时缺少相关的库文件(.a/.so) 在此,只举个静态库的例子,假设源码如下. 先把test.c编译成静态库(.a)文件
至此,我们得到了test.a文件.我们开始编译main.c
这时,则生成了main.o文件,然后我们再通过如下命令进行链接希望得到可执行程序.
你会发现,编译器报错了:
其根本原因也是找不到test()函数的实现文件,该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个库,链接命令修改为如下形式即可.
【扩展】:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main.c和test.a执行如下命令.
3. 链接的库文件中又使用了另一个库文件 这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,,还是看看测试代码. 从上图可以看出,main.c调用了test.c的函数,test.c中又调用了fun.c的函数.
然后,将test.c和func.c各自打包成为静态库文件.
这时,我们准备将main.o链接为可执行程序,我们的main.c中包含了对test()的调用,因此,应该在链接时将test.a作为我们的库文件,链接命令如下.
这时,编译器仍然会报错,如下:
就是说,链接的时候,发现我们的test.a调用了func()函数,找不到对应的实现.由此我们发现,原来我们还需要将test.a |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |