zoukankan      html  css  js  c++  java
  • so库链接和运行时选择哪个路径下的库?

        总结今天遇到的一个so库链接、运行问题。

        这几天修改了xapian的源码,重新编译so库,再重新编译之前的demo程序,跑起来后却发现执行的函数并非我修改过的,使用的还是老版本。折腾了一会儿,发现是因为/usr/local/lib目录中含有同名so库导致。这里记录下正确的解决思路。

    1 确保链接到了正确的so库

        gcc可以通过-L指定链接时所依赖库的搜索路径,譬如:g++ -std=c++0x -L/data/home/cswuyg/xapian_proj/xapian-core-1.2.25-install/lib -o hello_world hello_world.o  -lxapian。那么,如果系统路径中跟-L路径中有同名库,哪个更优先呢?优先级如下:

    (1)-L指定的目录;

    (2)环境变量LIBRARY_PATH指定的目录;

    (3)/lib /usr/lib usr/local/lib 目录;

        也就是说-L指定的目录是优先使用的,即便系统目录中含有同名so库,也没有关系。可以在编译命令中加上--verbose查看链接详情信息,会列出来collect2所使用的所有-L目录。对编译链接出来的ELF文件,可以采用ldd工具查看依赖的so情况

    2 确保运行时使用了正确的so库

        链接和运行所搜索的so库路径是分开的,可以通过在链接时通过-Wl-rpath=xx强制指定从某个地方读取,譬如强制在同目录下读取:g++ -std=c++0x -L/data/home/cswuyg/xapian_proj/xapian-core-1.2.25-install/lib  -Wl,-rpath=. -o hello_world hello_world.o  -lxapian 。

        之前我遇到的问题就是因为没有使用-Wl,-rpath,导致运行时使用的so是系统目录下的同名so。

         链接和运行时的so路径资料可以参考这里:https://www.cnblogs.com/youxin/p/5357614.html

  • 相关阅读:
    浏览器—CORS 通信的学习总结
    前端算法
    移动端适配时对meta name="viewport" content="width=device-width,initial-scale=1.0"的理解
    react和vue的区别
    对xss攻击和csrf攻击的理解
    前端如何解决跨域
    你没那么重要
    五福
    天道
    决策
  • 原文地址:https://www.cnblogs.com/cswuyg/p/10568945.html
Copyright © 2011-2022 走看看