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 可执行程序运行时,会在LD_LIBRARY_PATH   动态库的查找路径 查找,当找到A库时加载,如果其他的文件中存在相同的库函数,若两个库函数不一致,则有可能导致出现undefined symbol。
解决办法:    排查LD_LIBRARY_PATH 的值下的文件中是否存在相同的库文件。

二、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这个文件名。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章