LD_LIBRARY_PATH 与 LIBRARY_PATH

Posted

技术标签:

【中文标题】LD_LIBRARY_PATH 与 LIBRARY_PATH【英文标题】:LD_LIBRARY_PATH vs LIBRARY_PATH 【发布时间】:2011-05-14 03:09:50 【问题描述】:

我正在构建一个简单的 C++ 程序,并且我想暂时将系统提供的共享库替换为更新版本的共享库,以进行开发和测试。

我尝试设置 LD_LIBRARY_PATH 变量,但链接器 (ld) 失败:

/usr/bin/ld: 找不到-lyaml-cpp

我希望它可以工作,因为根据 ld 手册页:

链接器使用以下搜索 找到所需共享的路径 库:...对于本机链接器, 环境变量的内容 “LD_LIBRARY_PATH”...

然后我尝试设置 LIBRARY_PATH,并且成功了。

根据 GCC 手册:

价值 LIBRARY_PATH 是一个冒号分隔的列表 目录,很像 PATH。什么时候 配置为本机编译器,GCC 尝试如此指定的目录 搜索特殊链接器时 文件,如果找不到它们使用 GCC_EXEC_PREFIX。使用 GCC 链接 也使用这些目录时 寻找普通图书馆 -l 选项(但目录 用 -L 指定在前)。

正如 (GCC) 手册所建议的那样,LIBRARY_PATH 有效,因为我与 GCC 链接。

但是..

既然我与 gcc 链接,为什么 ld 是 被调用,作为错误消息 建议? 有什么意义 有两个变量服务相同 目的?有没有其他的 区别?

【问题讨论】:

【参考方案1】:

LIBRARY_PATH 在编译前被 gcc 用于搜索包含需要链接到您的程序的静态和共享库的目录。

LD_LIBRARY_PATH 被您的程序用于在成功编译和链接后搜索包含共享库的目录。

编辑: 如下所述,您的库可以是静态的或共享的。如果它是静态的,那么代码将被复制到您的程序中,并且您无需在程序编译和链接后搜索库。如果您的库是共享的,那么它需要动态链接到您的程序,这就是LD_LIBRARY_PATH 发挥作用的时候。

【讨论】:

当然 LD_LIBRARY_PATH 只对动态库有意义 我的意思是,如果我要使用 ld 进行链接(直接),那么根据 ld 手册,LD_LIBRARY_PATH 将用于搜索包含需要链接到的库的目录我的程序。我一定在这里遗漏了一些东西.. 除非您自己调用 ld 并将目标文件与库合并,否则它将“继承” gcc 传递给它的路径。您可以使用 -Xlinker 选项覆盖标准 gcc。 其实LIBRARY_PATH 是用来搜索包含静态AND动态库的目录,而不仅仅是静态库。 是的,这是错误的 - 区别在于 LIBRARY_PATH编译时搜索库(静态或动态)LD_LIBRARY_PATH 在运行时搜索动态库时间。当然在运行时你不需要搜索静态库。【参考方案2】:

程序启动时搜索LD_LIBRARY_PATH,链接时搜索LIBRARY_PATH

来自comments的警告:

使用ld(而不是gccg++)链接库时,不会读取LIBRARY_PATHLD_LIBRARY_PATH 环境变量。 使用gccg++ 链接库时,将读取LIBRARY_PATH 环境变量(请参阅documentation "gcc uses these directories when searching for ordinary libraries")。

【讨论】:

注意:链接库时,ld 本身不会在 LIBRARY_PATHLD_LIBRARY_PATH 中查找库。只有当gcc 调用ld 时,LIBRARY_PATH 才会被使用。 (这很难学到。) @Rufflewind 很有趣,但如果您提供任何参考资料会更多。 此视图在搜索库的时刻(链接时间与运行时间)进行区分,而 @Naveen 区分搜索的库类型(静态与动态)。是否有两个视图实际上相同(动态:运行时间 = 静态:链接时间)或者是否存在这种对应关系不成立的重要情况?我猜想在编译时也需要一些关于动态库的知识。 @Rufflewind 嗨,Rufflewind。我阅读了ld 的手册,上面写着ld 在搜索共享库的依赖项时只搜索LD_LIBRARY_PATH。如果你只是运行ld -lSOMETHING,它确实不会在LD_LIBRARY_PATH 中搜索这些路径。【参考方案3】:

由于我与 gcc 链接,为什么 ld 被调用,正如错误消息所暗示的那样?

gcc 在链接模式下会在内部调用 ld。

【讨论】:

【参考方案4】:

LIBRARY_PATH 被链接器 (ld) 使用

LD_LIBRARY_PATH 被加载器(ld.so)使用

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于LD_LIBRARY_PATH 与 LIBRARY_PATH的主要内容,如果未能解决你的问题,请参考以下文章

LD_LIBRARY_PATH 不包含导出的路径

makefile文件中如何使用 export LD_LIBRARY_PATH=/myfile/makefile:$LD_LIBRARY_PATH

Oozie 设置 LD_LIBRARY_PATH

环境变量LD_LIBRARY_PATH的传递

在运行时为 ctypes 更改 LD_LIBRARY_PATH

linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)