动态库的加载与测试

之前写了个程序,使用了第三方库lzma(装了xz命令(make install))。程序写好以后,编译没有问题,但是运行时却报了如下的错误:

./Searcher: error while loading sharedlibraries: liblzma.so.5: cannot open shared object file: No such file or directory

我重新察看了一下当时安装xz的log,发现liblzma.so.5其实已经在如下目录里面了

ll /usr/local/lib/liblzma.so.5.0.5

-rwxr-xr-x 1 root root 562091 Aug 13 16:37/usr/local/lib/liblzma.so.5.0.5

但为什么程序运行时找不到呢?

在网上查询了一下答案,可能的原因是虽然库文件已经放在系统动态库路径下面了,但是系统并不能自动识别它,需要手动告诉系统它的存在(除非重起服务器)。只需要简单的一条命令ldconfig,系统就会自己去重新生成一份动态库文件了。

另外,其实我们在启动程序之前,也可以考察一下其动态库是否都能找到,使用ldd命令即可:

ldd ./Searcher

       libdl.so.2 => /lib64/libdl.so.2 (0x000000323e800000)

       libpthread.so.0 => /lib64/libpthread.so.0 (0x000000323ec00000)

       liblzma.so.5 => not found

       libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003251e00000)

       libm.so.6 => /lib64/libm.so.6 (0x000000323e400000)

       libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000324fa00000)

       libc.so.6 => /lib64/libc.so.6 (0x000000323e000000)

       /lib64/ld-linux-x86-64.so.2 (0x000000323dc00000)

顺道再提一下编译的情况。如果需要使用某个第三方动态库文件,在编译选项中需要这么写:-llzma。其中-l表示需要使用某库文件(动态库或者静态库)。lzma只是库名的简称,系统会自动在前面加上lib,在后面加上.so。再举一个例子,如果使用libm.so.6,只需要这么写:-lm。对于需要静态加载的库文件(通常以.a结尾,而非.so),需要使用编译选项的-L来标明静态库文件的路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值