undefinedreferenceto错误总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
undefined reference to 问题解决方 2012-03-07 20:1319462人阅读评论(9)收藏举报? 最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13):?undefined?reference?to?`func???? 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1.? 链接时缺失了相关目标文件(.o)????测试代码如下:???? 然后编译。gcc?-c?test.c ?gcc?–c?main.c???? 得到两个 .o 文件,一个是 main.o,一个是 test.o ,然后我们链接 .o 得到可执行程序:gcc?-o?main?main.o???? 这时,你会发现,报错了:main.o:?In?function?`main: ?main.c:(.text+0x7):?undefined?reference?to?`test ?collect2:?ld?returned?1?exit?status???? 这就是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件,本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。gcc?-o?main?main.o?test.o??? 【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的。gcc?-o?main?main.c?//缺少test()的实现文件?需要改成如下形式才能成功,将test()函数的实现文件一起编译。gcc?-o?main?main.c?test.c?//ok,没问题了?2.??? 链接时缺少相关的库文件(.a/.so)????在此,只举个静态库的例子,假设源码如下。??? 先把test.c编译成静态库(.a)文件gcc?-c?test.c ?ar?-rc?test.a?test.o???? 至此,我们得到了test.a文件。我们开始编译main.cgcc?-c?main.c???? 这时,则生成了main.o文件,然后我们再通过如下命令进行链接希望得到可执行程序。gcc?-o?main?main.o???? 你会发现,编译器报错了:/tmp/ccCPA13l.o:?In?function?`main: ?main.c:(.text+0x7):?undefined?reference?to?`test ?collect2:?ld?returned?1?exit?status???? 其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个库,链接命令修改为如下形式即可。gcc?-o?main?main.o?./test.a??//注:./?是给出了test.a的路径????? 【扩展】:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main.c和test.a执行如下命令。gcc?-o?main?main.c?./test.a??//同样,如果不加test.a也会报错?3.??? 链接的库文件中又使用了另一个库文件??? 这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,首先,还是看看测试代码。??? 从上图可以看出,main.c调用了test.c的函数,test.c中又调用了fun.c的函数。??? 首先,我们先对fun.c,test.c,main.c进行编译,生成 .o文件。gcc?-c?func.c ?gcc?-c?test.c ?gcc?-c?main.c???? 然后,将test.c和func.c各自打包成为静态库文件。ar?–rc?func.a?func.o ?ar?–rc?test.a?test.o???? 这时,我们准备将main.o链接为可执行程序,由于我们的main.c中包含了对test()的调用,因此,应该在链接时将test.a作为我们的库文件,链接命令如下。gcc?-o?main?main.o?test.a???? 这时,编译器仍然会报错,如下:test.a(test.o):?In?function?`test: ?test.c:(.text+0x13):?undefined?reference?to?`func ?collect2:?ld?returned?1?exit?status???? 就是说

文档评论(0)

dashewan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档