【发布时间】:2016-01-20 19:40:35
【问题描述】:
我已经编程了一段时间,但我仍然不完全了解链接器的行为方式。
例如,今天我下载并安装了一个我想在我的 Linux 应用程序中使用的库。 (它是 Xerces - 用于解析 XML 文件)。
我创建了一个 makefile,并在我的命令中为它提供了 .so 和 .a 文件的路径:-L/usr/local/lib,还告诉它要包含的库的名称:-lxerces-c-3.1 .
我的应用程序编译正常,但在运行时失败,出现“无法打开共享对象文件 libxerces-c-3.1.so”。当我在makefile中正确地给它路径和名称时,为什么会出现这种情况?
然后我将库路径添加到我的 .bashrc 文件中的 LD_LIBRARY_PATH 变量中,然后它就起作用了。这很好,但是如果我现在在我的 makefile 中删除库的路径并且甚至不包含库的名称,它仍然可以工作。
我对这里发生的事情感到困惑。仅通过将路径分配给 LD_LIBRARY_PATH 变量,它如何仍然找到正确的库,并且只有在我这样做的情况下才能工作?我在别处读过甚至不使用 LD_LIBRARY_PATH。
感谢您对此的任何回答。这个问题有点长,希望不会离题,但我希望其他人也可以从中学习。谢谢
【问题讨论】:
-
我建议从你的 makefile 中添加最少的规则集来演示这个问题,最多 10 行。照原样,我们只能推测您的 makefile 中的确切内容以及是否可以提供最佳改进。祝你好运。
-
查看这篇文章:stackoverflow.com/questions/1904990/…,其中已经回答了类似的问题
-
-L和LD_LIBRARY_PATH影响两个非常不同(但相关)的操作。编译时链接和运行时链接。
标签: c++ c linux makefile linker