再谈makefile指定头文件和库出错的那点破事(折腾了0.5小时)------三个月后发现了真正原因

在解决makefile指定头文件和库的编译错误时,作者遇到新的挑战。编译test.so库后加载失败,通过ldd -r和c++filt分析发现缺少库,但在修改makefile添加-L和-l后问题依旧。经过排查,发现并非makefile文件错误,而是库的链接顺序导致。将-L和-l提前,问题得到解决。三个月后回顾,理解到当多个目录有同名库时,链接会优先选择先找到的库。
摘要由CSDN通过智能技术生成

       在文章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顺序后, 就改变了链接的库。 项目中的库被到处拷贝, 当多个目录中有同名库时, 以先找到的为准, 原来如此 哭哭



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值