现在的位置: 首页 > 综合 > 正文

xx.cpp undefined reference to xx 解决办法

2013年10月19日 ⁄ 综合 ⁄ 共 808字 ⁄ 字号 评论关闭

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

     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的原理,才是解决一些问题的终极之道。

抱歉!评论已关闭.