在文章http://blog.csdn.net/stpeace/article/details/50985578中, 我对makefile指定头文件和库出错的那点破事进行了详细总结, 基本能搞定大部分情况。在本文中, 我来说说自己最近在某新模块中遇到的一个makefile编译错误。
编译好test.so库后, 启动后台服务, 加载test.so库, 发现failed to open...., 很显然, 缺少链接库, 于是用ldd -r test.so和c++filt xxx命令分析出了缺少那个库, 于是在makefile中指定, 比如添加:
-L /x/y/x/ -labc
但是, 奇怪的是, 变出新库后, 还是有上述问题, 我最开始以为自己改错了makefile文件, 而是别的makefile文件, 后来发现, 找的makefile文件是对的, 但是在编译的时候,编译信息中居然没有-L /x/y/x/ -labc, 看来, 修改的makefile根本没有生效啊。
难道是顺序问题? 于是将-L /x/y/x/ -labc提前, 果然OK, 尼玛, 原来如此。
这也算一次经历吧, 折腾我0.5小时。
过了三个月, 回过再看看这篇文章,就明白过来了。 为什么改变顺序后就OK了呢? 因为: 改变makefile顺序后, 就改变了链接的库。 项目中的库被到处拷贝, 当多个目录中有同名库时, 以先找到的为准, 原来如此