免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1499 | 回复: 4

[Linux] 链接库 和 执行库 区别 [重大发现] [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2014-03-26 01:27 |显示全部楼层
今天在使用 libcurl 的时候,发现这个问题。
源码安装 libcurl 在 /usr/local/curl 目录,然后将 /usr/local/curl/lib 加入 ld.so.conf 文件, ldconfig 。

gcc example.c -I /usr/local/curl/include -L /usr/local/curl/lib -lcurl
这样编译链接 一点问题都没有!确实,毕竟库都能找到吧

下面我把 /usr/local/curl/lib 目录不小心删掉了,然后执行刚编译的程序。出乎意料的是这个程序居然能正常执行!! 库不是被删除了吗? 难道在别的地方还存在?
于是 dpkg -l | grep libcurl
果然,在 /usr/lib/i386-linux-gnu 下面也存在一个 libcurl.so.4 。
好吧,既然存在这样的库,那么我再次编译上面的程序:
gcc example.c -I /usr/local/curl/include -L /usr/lib/i386-linux-gnu -lcurl 遗憾的是,编译不过,说是找不到 lcurl 库。
接下来就纠结半天! 我想到会不会是这个 libcurl.so.4 后面这个 .4 导致找不到 lcurl 呢, 于是在/usr/lib/i386-linux-gnu下做 ln -s libcurl.so.4 libcurl.so
再次编译,程序又成功了!

进一步想一下, /usr/lib/i386-linux-gnu 这个目录是在 ld.so.conf 文件中加进来的,gcc 会自动在这个目录下去查找,那么能不能不用 -L 参数来指定呢,于是
gcc example.c -lcurl  可喜,也成功的生成了可执行程序。
想到我前面把 /usr/local/curl/lib 也加到了 ld.so.conf 了的,并且执行了 ldconfig ! 于是想将刚做的这个  ln -s libcurl.so.4 libcurl.so 操作恢复回去,即删除这个链接,并且恢复
/usr/loca/curl/lib 目录,再次执行 gcc example.c -lcurl ,事与愿违啊,执行又失败了,找不到库!
这是什么节奏啊! 不是都加到 ld 的搜索路径了吗,怎么还找不到呢, 怎么在 /usr/lib/i386-linux-gnu 目录下,可以找到呢?



通过以上反复实验,得到如下结论:
在编译链接是库的名字必须严格匹配,比如有 -lcurl 一定是匹配 libcurl.so 或 libcurl.a ,libcurl.so.x.x 这样的文件是匹配不到的!但是在执行的时候,可以匹配!

还存在一个问题,望大家指点下迷津: 为什么在 /usr/local/curl/lib 这个路径加到了 ld.so.conf并且 ldconfig 后,gcc 在编译的时候不显示指定该路径,会找不到库呢?

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2014-03-26 08:55 |显示全部楼层
没人,自己顶一下!

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-03-26 10:38 |显示全部楼层
楼主看下linker和loader的区别,基本上就是你的问题原因了。

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2014-03-26 12:02 |显示全部楼层
回复 3# timespace


针对linker   
/usr/lib/i386-linux-gnu 和 /usr/local/curl/lib 都在 ld.so.cache 中进行了缓存,为什么使用前者路径下的库不用显示 -L 指定,而后者需要呢?
那么 ld.so.conf 这个文件配置了,不是没起作用吗?

论坛徽章:
0
发表于 2014-03-26 12:22 |显示全部楼层
gcc -print-search-dirs
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP