【问题标题】:In Ubuntu (14.04), is there an equivalent to /etc/ld.so.conf.d for the linker?在 Ubuntu (14.04) 中,链接器是否有 /etc/ld.so.conf.d 的等价物?
【发布时间】:2015-03-19 19:34:52
【问题描述】:

这是关于位于中心位置的路径规范的问题,例如 PATH、LD_LIBRARY_PATH 和 LIBRARY_PATH。

我知道有两种方法可以为加载程序指定共享库路径:将它们添加到 LD_LIBRARY_PATH,或者将文件添加到 /etc/ld.so.conf.d/。我也知道后者被认为是更现代和更受欢迎的方式。

我还知道您可以通过编辑 LIBRARY_PATH 为链接器指定标准库路径。这仍然是“现代”方式吗,还是现在我应该使用“ld.so.conf.d-style”替代方案?

编辑:人们在问“为什么”,所以:

我正在使用一个 Python 包 (Theano),它在运行时会动态生成和编译 CUDA 和 C++ 代码。它链接到的库之一是 NVidia 的 cuDNN。我不知道为什么 Theano 的开发者将它链接到静态库而不是动态库。

【问题讨论】:

  • 请解释你为什么问这个问题。使用静态链接的二进制文件,您的问题没有真正的意义。但是您应该更喜欢动态链接的二进制文件。您希望在运行时更改其静态库的可执行文件有哪些?
  • 您是否正在寻找链接器在确定在何处查找静态库时会注意的机制(在链接时,而不是运行时)?

标签: linux ubuntu linker sysadmin system-paths


【解决方案1】:

对于静态库,没有任何与ld.so.conf.d/ 等效的方法。您仍然只需通过 LIBRARY_PATH 环境变量指定标准链接器搜索路径,并通过命令行标志指定链接器的其他路径。

要明确:

  • LIBRARY_PATH:由链接器在编译时使用。链接器使用它来查找静态库和动态库。
  • LD_LIBRARY_PATH:加载程序在运行时使用它来查找动态库。

【讨论】:

  • 链接器不需要标准搜索路径,但为了方便起见,似乎有一个(LIBRARY_PATH)。我只是想知道调整 LIBRARY_PATH 是否仍然是最现代的方法。
  • 好的,您对问题的措辞有些困惑,因为 ld.so.conf 和 LD_LIBRARY_PATH 是运行时的。而你真正的意思是链接时间。是的,如果您出于某种原因想要覆盖或扩展默认的标准库路径,那么 LIBRARY_PATH 就是这样做的方法。对于一次性或特定于应用程序的构建,您通常只需使用 Makefile 中的“-L”选项。
  • 看起来 LD_LIBRARY_PATH 和 LIBRARY_PATH 的用途相同,一个用于动态加载共享库,而后者用于静态链接器。那么,为什么有一个类似于 ld.so.conf.d/ 的静态链接不一定“有意义”呢?如果您编辑答案来解决这个问题,我会选择它。
  • 答案已更新。具体来说,LIBRARY_PATH 在编译时适用于静态库和动态库。 LD_LIBRARY_PATH 仅与运行时的动态库相关。在运行时没有静态库的搜索路径的概念或需要。
  • 我当然明白在运行时没有静态库的搜索路径的概念或需要。大多数都这样做。问题中也没有提到这样的概念;在看到 LD_LIBRARY_PATH 被提及后,您产生了幻觉。我提到这一点是因为问题是关于位于中心的路径规范,例如 LIBRARY_PATH 和 PATH。我将编辑问题和您的答案,以再次强调这一重点。
【解决方案2】:

静态库在(静态)链接时解析,并且根据定义没有任何运行时方面。

我的意见是你应该避免使用静态库,并且总是更喜欢共享库。

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2013-06-21
    • 2014-01-09
    • 2012-02-18
    • 2014-05-02
    相关资源
    最近更新 更多