Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc LD_LIBRARY_PATH vs LIBRARY_PATH 我正在构建一个简单的C++程序,我想暂时将系统提供的共享库替换为一个更新近的版本,用于开发和测试。_Gcc_G++_Ld - Fatal编程技术网

Gcc LD_LIBRARY_PATH vs LIBRARY_PATH 我正在构建一个简单的C++程序,我想暂时将系统提供的共享库替换为一个更新近的版本,用于开发和测试。

Gcc LD_LIBRARY_PATH vs LIBRARY_PATH 我正在构建一个简单的C++程序,我想暂时将系统提供的共享库替换为一个更新近的版本,用于开发和测试。,gcc,g++,ld,Gcc,G++,Ld,我尝试设置LD_LIBRARY_PATH变量,但链接器(LD)失败,原因是: /usr/bin/ld:找不到-lyaml cpp 我希望这能起作用,因为根据ld手册: 链接器使用以下搜索 找到所需共享资源的路径 图书馆:。。。对于本机链接器, 环境变量的内容 “LD_库_路径” 然后我试着设置库路径,结果成功了 根据GCC手册: 价值 库路径是以冒号分隔的列表 目录的类型,很像路径。什么时候 配置为本机编译器,GCC 尝试这样指定的目录 搜索特殊链接器时 文件,如果无法使用 GCC_EXEC_前

我尝试设置LD_LIBRARY_PATH变量,但链接器(LD)失败,原因是:

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

我希望这能起作用,因为根据ld手册:

链接器使用以下搜索 找到所需共享资源的路径 图书馆:。。。对于本机链接器, 环境变量的内容 “LD_库_路径”

然后我试着设置库路径,结果成功了

根据GCC手册:

价值 库路径是以冒号分隔的列表 目录的类型,很像路径。什么时候 配置为本机编译器,GCC 尝试这样指定的目录 搜索特殊链接器时 文件,如果无法使用 GCC_EXEC_前缀。使用GCC链接 当需要时也使用这些目录 寻找普通图书馆 -l选项(但不包括目录) 用-L指定(以先到为准)

正如(GCC)手册所建议的,库路径之所以有效,是因为我链接了GCC

但是

  • 既然我和gcc有联系,为什么ld是 正在调用,作为错误消息 建议
  • 这有什么意义 有两个变量服务于同一个变量 目的?还有别的吗 差异

库路径
在编译之前由gcc用于搜索包含需要链接到程序的静态库和共享库的目录


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

编辑:
正如下面指出的,您的库可以是静态的,也可以是共享的。如果它是静态的,那么代码将被复制到您的程序中,在编译和链接程序后,您不需要搜索库。如果您的库是共享的,则需要将其动态链接到您的程序,此时
LD\u library\u PATH
起作用。

LD\u library\u PATH
在程序启动时搜索,
library\u PATH
在链接时搜索

警告:

  • 将库链接到
    ld
    (而不是
    gcc
    g++
    )时,不会读取
    LIBRARY\u路径
    ld\u LIBRARY\u路径
    环境变量
  • 将库与
    gcc
    g++
    链接时,将读取
    LIBRARY\u PATH
    环境变量(请参阅)
既然我链接了gcc,为什么要调用ld,正如错误消息所示


gcc在处于链接模式时在内部调用ld。

当然,ld_LIBRARY_PATH仅对动态库有意义。我的观点是,如果我(直接)使用ld进行链接,那么根据ld手册,ld_LIBRARY_PATH将用于搜索包含需要链接到我的程序的库的目录。我这里肯定遗漏了什么。除非您自己调用ld并将对象文件与库结合起来,否则它将“继承”gcc传递给它的路径。您可以使用-Xlinker选项覆盖标准gcc。实际上,
LIBRARY\u PATH
用于搜索包含静态和动态库的目录,而不是仅搜索静态库。是的,这是错误的-区别在于
LIBRARY\u PATH
用于搜索库(静态或动态)在编译时和
LD_LIBRARY_PATH
在运行时搜索动态库。当然,在运行时您不需要搜索静态库。注意:链接库时,
ld
本身不会在
LIBRARY\u路径
ld\u LIBRARY\u路径
中查找库。只有当
gcc
调用
ld
时,
LIBRARY\u PATH
才会被使用。(这是通过艰苦的学习得到的。)@Rufflewind很有趣,但如果您提供了任何参考,则会更有趣。此视图在搜索库时(链接时间与运行时间)进行了区分,而@Naveen对搜索的库类型进行了区分(静态与动态)。是否有两个视图实际上完全相同(动态:运行时=静态:链接时),或者在这种对应关系不成立的情况下是否存在重要情况?我想在编译时也需要一些关于动态库的知识。@Rufflewind嗨Rufflewind。我阅读了
ld
的手册,它说在搜索共享库的依赖项时,只搜索
ld\u库路径
。如果只运行
ld-lSOMETHING
,它实际上不会在
ld\u LIBRARY\u PATH
中搜索这些路径。