【问题标题】:Change link to shared libraries更改共享库的链接
【发布时间】:2012-07-31 16:00:23
【问题描述】:

我有一个可执行文件 A,它使用 dlopen 打开共享库 libB.so(位于同一目录中,因此我执行 LD_LIBRARY_PATH=. 以让我的程序正确找到它)。这个库 libB.so 应该在 libC.so 中找到它的一些符号,它也位于同一目录中。

但是,/usr/lib64 中还有一个 libC.so(它已使用不同的参数编译,因此它没有相同的符号),并且由于未知原因,libB.so 试图打开这个在同一目录中的那个。当我执行ldd libB.so 时,我可以看到libC.so => /usr/lib64/libC.so 而不是libC.so => /path/to/program/A/libC.so

有没有办法在 libB.so 中更改此链接(如果可能,无需重新编译),或者如果我应该重新编译 libB.so,是什么让编译器选择在 /usr/lib64 中使用 libC.so 而不是其他一个?

(注意:替换 /usr/lib64 中的 libC.so 不是一个选项,因为我不是平台的管理员)

谢谢

【问题讨论】:

    标签: c libraries shared


    【解决方案1】:

    如果我对手册页的理解正确,LD_LIBRARY_PATH 应该取代像 /usr/lib64 这样的系统范围的路径,所以我不确定为什么这不起作用。

    它是一个 setuid / setgid 程序吗? LD_LIBRARY_PATH 被忽略。

    当前路径 (.) 是否正在发生变化,以至于 LD_LIBRARY_PATH=. 不再让 libB 找到 libC?

    通过strace 运行您的程序应该可以让您看到 ldd 正在检查 libC 的目录;这可能会帮助您调试搜索的位置和方式。

    【讨论】:

      【解决方案2】:

      我发现了问题所在:我在一台超级计算机上运行,​​当然有些事情是在程序实际运行之前在后台使用环境变量完成的。这弄乱了我的共享库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2021-07-25
        • 2016-01-02
        • 2013-08-15
        • 1970-01-01
        相关资源
        最近更新 更多