【问题标题】:What is the difference between exporting library paths to LD_LIBRARY_PATH and using the -L flags while linking?将库路径导出到 LD_LIBRARY_PATH 和在链接时使用 -L 标志有什么区别?
【发布时间】:2012-08-26 06:18:22
【问题描述】:

进一步说明我的情况。我知道当您使用动态库时,您需要将库路径导出到 LD_LIBRARY_PATH,以便可执行文件在运行时找到这些库。如果我不这样做,就会出现一个错误,即找不到共享库。

现在,如果我添加以下链接器标志“-L/path/to/library/-lthelibrary.so”,我可以运行我的可执行文件,而无需将库路径导出到 LD_LIBRARY_PATH。

这是为什么?

【问题讨论】:

  • 嗯,据我所知,除了可执行文件中的“rpath”条目之外,没有任何方法可以嵌入实际搜索路径,但为此,必须设置 LD_RUN_PATH(不是 LD_LIBRARY_PATH) .运行“readelf -d”时是否显示路径?

标签: c linker shared-libraries


【解决方案1】:

首先,您通常需要设置LD_LIBRARY_PATH 来运行二进制文件。加载程序使用此环境变量来查找 其他 位置,以便在执行二进制文件时查找要加载的 .so 文件。

您需要设置LD_LIBRARY_PATH,如果您的二进制文件引用了一个或多个.so 文件,而这些文件在编译时所在的位置不可用。如果任何直接引用的 .so 文件依赖于在创建 .so 文件时不可用的东西,也需要它。

使用ldd 命令检查二进制文件中的依赖信息,以便更清楚地了解创建二进制文件时链接器保存的内容。

【讨论】:

  • 好的,ldd 命令很有帮助。如果没有 LD_LIBRARY_PATH 的帮助,二进制文件似乎只是找不到一个库。构建二进制文件时,该库仍在同一位置。这可能是什么原因?
  • 顺便说一下,这个库是libiniparser.so.0,其他的以.so结尾。我是否必须创建一个符号 libiniparser.so 链接,并且它是否必须与 libiniparser.so.0 位于同一目录中?
  • 好的,这就是答案。现在可以使用了!
  • @schwalbs 很高兴我能提供帮助,并且您解决了剩下的问题。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2012-11-17
  • 1970-01-01
  • 2012-01-18
  • 2021-03-19
相关资源
最近更新 更多