linux 动态库搜索路径优先顺序以及Makefile 编译设置

一、linux 下 动态库搜索路径优先顺序

  1. 编译目标代码时指定的动态库搜索路径;
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;配置后要运行 ldconfig命令才能生效
  4. 默认的动态库搜索路径/lib;
  5. 默认的动态库搜索路径/usr/lib;

1是最优先的, 使用gcc -Wl,--rpath -Wl,${LIB_DIR1} ./app  指定了搜索路径

注:当elf 可执行程序运行时,会在动态库的查找路径查找SO,当找到A库时加载,如果其他的库文件中存在相同的库函数,先链接谁,就是用谁,另一个会被丢弃

二、linux Makefile 

  1. -Xlinker --unresolved-symbols=ignore-in-shared-libs   编译动态链接库的时候最好加上 来检查一下。这样如果是自己的疏忽在 .c 源文件里面忘记的 某函数的定义,编译的时候就可以提示错误了
  2. -WL,-rpath=     指定编译的可执行文件首先搜寻的库依赖的文件路径
  3. -Wl,--version-script=Makefile.symbol   编译动态链接库时 选择导出的符号,未导出的符号,运行时将会报undefined symbol
  4. -Wl,-soname    -Wl选项告诉编译器将后面的参数传递给链接器。 -soname则指定了动态库的soname(简单共享名,Short for shared object name) 有一个程序ap1,以及一个库libtest.so.1
    比如 ,ap1启动的时候需要libxxx.so.1
    如果链接的时候直接把libxxx.so.1传给了ap1,那么将来库升级为libtest.so.2的时候,ap1仍然只能使用 libxxx.so.1的代码,并不能得到升级的好处。而如果指定了soname为libxxx.so,那么ap1启动的时候将查找的就是 libxxx.so,而不是其在被链接时实际使用的库libxxx.so.1这个文件名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值