关于动态库的link -rpath-link的问题

问题:gcc link过程中在无法找到动态lib 提示错误

.../ld: warning: libcurl.so.4, needed by /home/xx/xx/xx/xx/lib/libtest.so, not found (try using -rpath or -rpath-link)

-rpath和-rpath-link都可以在编译链接时指定库的路径;-rpath-link只指定的编译link路径,链接器没有将库的路径包含进可执行文件中;所以编译时库的路径和在运行系统的库路径可以不一样;

-rpath可以做编译link和执行路径,链接器已经将库的路径包含在可执行文件中,编译时库的路径和在运行系统的库路径必须一样;

  LD_LIBRARY_PATH指的是运行可执行文件所要依赖的路径,与编译无关;不管编译是否使用-rpath或-rpath-link参数;

解决的方法:

-Wl,-rpath-link=/home/xxx/xxx/xxx/lib

-rpath和-rpath-link是ld的参数不是gcc的, gcc本身是不能识别这个参数的链接的时候 gcc会调用ld -Wl就是表明这个参数是ld的 gcc应该将其传给ld。

查看库的依赖关系和位置:

在执行环境下(非编译环境)执行 ldd 可执行文件可以查看库的依赖关系和内存位置,是否缺少库的信息

# ldd 可执行文件
        libpthread.so.0 => /lib/libpthread.so.0 (0x77383000)
        libstdc++.so.6 => /lib/libstdc++.so.6 (0x77227000)
        libcurl.so.4 => /usr/local/lib/libcurl.so.4 (0x76dc7000)
        libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x76d58000)
        libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x76b91000)
        libz.so.1 => /usr/local/lib/libz.so.1 (0x76b67000)
        libcares.so.2 => /usr/local/lib/libcares.so.2 (0x76b46000)
        libssl.so.1.1 => /usr/local/lib/libssl.so.1.1 (0x76ad6000)
        libcrypto.so.1.1 => /usr/local/lib/libcrypto.so.1.1 (0x768bf000)

 

存在动态库和静态库在链接时不要加-static, 否则会导致c库在app里出现多份容易会出问题,

编译环境下执行file 可执行文件可以看到可执行文件的类型 dynamically(动态库连接,stripped):

#file 可执行文件

 ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 4.4.59, stripped

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值