xx.cpp undefined reference to xx 解决办法

     网上相关的文章很多, 普通原因就那么两点。

     1)link的时候,添加相应的 so,.a 。

     2)  so .a 文件次序不对。 一般被调用者放到调用者的后面——有点饶,总之问题发生, 调换下 次序,可以解决。

      有时候,仍然会有一些莫名奇妙的 undefined reference to  xx 出现,原因不在上面2点内—— so/.a 文件已经全部添加, 相对位置也是对的,无论怎么调整总是出现 undefined reference to  xx, 在这种情况下,很可能是 相应的 so/.a 本身出现了问题。  我今天就亲生经历了这么一个案例。

      今天,我重新编译了 XBMC, 到 link 的时候,总是出现一大堆 PeripheralBusUSBLibUdev.cpp:156: undefined reference to xx, airplayserver.cpp:65: undefined reference to xx z之类。 按照传统办法,已经无法解决。 郁闷之际,决定去查看一下相应的 cpp,以及.a ,makefile 看看 到底是怎么回事,结果发现 Makefile 里面根本就没有 相应的 cpp,也就是报错的 cpp/obj文件根本就没有被编译,不应该被link,我重新删除掉,相应目录下的 .a ,cpp 对应的obj, .P文件,重新生成一下 .a,问题就解决了。

       问题的原因就在于, Makefile里面打包 obj到 .a的时候,一般直接使用  ar *.o 之类的命令,如果,你编译前没有做过 make clean, 那么该目录下,会有之前编译生成的 obj,P文件,如果,说你的编译刚好改了配置,重新 configure 过了,那么在新的 配置下,一些 文件不需要被编译。 然而,生成 .a文件的时候, 系统会把 “过时的” obj文件打包进来,造成一系列问题。

       具体的项目环境差异很大,千万不可墨守成规,搞清楚  编译,  link的原理,才是解决一些问题的终极之道。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值