gcc编译参数问题,-L -Wl -rpath

问题:
liba.so依赖libb.so,应用开发时,如何只显式的链接liba.so,而不显式链接libb.so?

rpath链接选项主要有两个功能:

(1)程序运行时,优先到rpath指定的目录去寻找依赖库

(2)程序链接时,在指定的目录中,隐式的链接那些动态库所需要的链接库。

往往我们都熟知第一个功能,忽略第二个功能。而第二个功能正是现在所需要的。

我们将liba.so,libb.so拷贝的同一个目录中,然后利用rpath链接应用程序,这样编译便不需要显式的去链接liba.so所依赖的库libb.so了。

gcc -o test test.c -I. -L. -la -Wl,-rpath=.


-Wl参数的理解
gcc的-Wl,xxx选项将逗号分隔的标记列表作为空格分隔的参数列表传递给链接器
gcc -Wl,aaa,bbb,ccc
最终变成了linker的用法:
ld aaa bbb ccc


链接选项和路径

-L: “链接”的时候,去找的目录,也就是所有的 -l 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。
编译时的-L选项并不影响环境变量LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,
系统还是会到默认路径下查找该程序所需要的库,如果找不到,还是会报错,类似cannot open shared object file。
当为当前目录时使用 -L . (注意空格) 

-rpath-link:这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,
后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。

-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。
对于交叉编译,交叉编译链接器需已经配置 –with-sysroot 选项才能起作用。
也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时查找需要加载的动态库。
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值