【问题标题】:LD_LIBRARY_PATH vs LIBRARY_PATHLD_LIBRARY_PATH 与 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 是 被调用,作为错误消息 建议?
  • 有什么意义 有两个变量服务相同 目的?有没有其他的 区别?

【问题讨论】:

    标签: gcc g++ 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 本身不会在 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
      猜你喜欢
      • 2015-10-27
      • 2013-08-16
      • 1970-01-01
      • 2015-09-23
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多