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
(而不是gcc
或g++
)链接库时,不会读取LIBRARY_PATH
或LD_LIBRARY_PATH
环境变量。
使用gcc
或g++
链接库时,将读取LIBRARY_PATH
环境变量(请参阅documentation "gcc
uses these directories when searching for ordinary libraries")。
【讨论】:
注意:链接库时,ld
本身不会在 LIBRARY_PATH
或 LD_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的主要内容,如果未能解决你的问题,请参考以下文章
makefile文件中如何使用 export LD_LIBRARY_PATH=/myfile/makefile:$LD_LIBRARY_PATH