【问题标题】:How to link shared libraries in local directory, OSX vs Linux如何链接本地目录中的共享库,OSX vs Linux
【发布时间】:2010-10-27 13:51:09
【问题描述】:

我在沙盒目录中安装了一些共享/动态库。我正在构建一些链接到库的应用程序。在这方面,我遇到了 OSX 和 Linux 之间的差异,我不确定(最好的)解决方案是什么。

在 OSX 上,库本身的位置被记录到库中,因此如果您的应用程序链接到它,可执行文件知道在运行时到哪里查找库。这与我的沙盒的预期效果一样,因为可执行文件在那里而不是系统范围的安装路径。

在 Linux 上我无法让它工作。显然图书馆位置不存在于图书馆本身。据我了解,您必须将包含库的文件夹添加到 /etc/ld.so.conf 并通过运行 ldconfig 重新生成 ld 缓存。

这似乎对我不起作用,因为我的库位于用户主目录中。看起来 ldconfig 不喜欢那样,这实际上是有道理的。

我该如何解决这个问题?我不想将库移出我的沙盒。

【问题讨论】:

    标签: linux macos shared-libraries sandbox


    【解决方案1】:

    在 Linux 上,运行您的程序并将环境变量 LD_LIBRARY_PATH 设置为您的沙盒目录。

    (我记得曾使用标志 -R 将库路径包含在二进制文件中,但它要么已从 gcc 中删除,要么仅在 BSD 系统上可用。)

    【讨论】:

    • 我不知何故认为 LD_LIBRARY_PATH 被 ldconfig 使用了。我不知道您可以动态更改它。它就像一个魅力。谢谢!
    • -Wl,-rpath,/path/to/sandbox
    【解决方案2】:

    在 Linux 上,您应该将 LD_RUN_PATH 设置为您的沙盒目录。这比设置LD_LIBRARY_PATH 更好,因为您在链接时间告诉链接器库在哪里,而不是在运行时间告诉共享库加载器。 p>

    见:http://xahlee.org/UnixResource_dir/_/ldpath.html

    【讨论】:

    • 这种方式似乎将 RPATH 设置为二进制文件,这对于沙盒应用程序来说可能很好,但通常无法移动应用程序。
    • 沙盒应用是这里的问题。 “移动应用程序”是什么意思?二进制分布?在这种情况下,LD_RUN_PATH 将无济于事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多