0

读完这个问题后,我的第一反应是用户没有看到错误,因为他指定了库的位置-L

但是,显然,该-L选项只影响链接器的外观,而不会影响您尝试运行已编译的应用程序时加载器的外观。

那么我的问题是有什么意义-L呢?既然除非你有正确的目录,否则你将无法运行你的二进制文件LD_LIBRARY_PATH,为什么不把它们放在首位,然后删除-L, 因为链接器会LD_LIBRARY_PATH自动查找呢?

4

5 回答 5

6

可能是您正在交叉编译并且链接器的目标系统不是您自己的系统。例如,MinGW 可用于在 Linux 上编译 Windows 二进制文件。这里-L将指向链接所需的 DLL,LD_LIBRARY_PATH并将指向链接器运行所需的任何库。这允许编译和链接不同的架构、操作系统 ABI 或处理器类型。

在尝试构建特殊目标时它也很有帮助。我可能会将程序的静态版本链接到不同的静态库。这是 Linux From Scratch 的第一步,在主系统上创建一个单独的迷你环境以成为chroot监狱。

于 2012-07-08T18:28:30.867 回答
3

设置LD_LIBRARY_PATH将影响您为构建代码而运行的所有命令(包括编译器本身)。

这通常是不可取的(例如,您可能不希望您的编译器在编译时运行调试/检测库 - 它甚至可能会破坏您的编译)。

用于-L告诉编译器在哪里查找,LD_LIBRARY_PATH以影响运行时链接。

于 2012-07-08T18:29:21.917 回答
3

构建二进制文件和运行二进制文件是两个完全独立且不相关的过程。您似乎建议运行环境应该影响构建环境,即您似乎假设在某些设置(帐户,机器)中构建的代码稍后将在相同的设置中运行。我觉得这个假设很奇怪。我什至会说,在大多数情况下,构建和运行是在不同的环境中完成的。实际上,我希望我的编译器不要从调用这些编译器的环境中得出关于未来运行环境的任何假设。查看LD_LIBRARY_PATH构建环境将是一个主要的禁忌。

于 2012-07-08T19:01:13.483 回答
3

其他答案都很好,但还没有人提到的是静态库。大多数情况下,当您使用-L它时,您会使用在您的构建树中本地构建的静态库,您不打算安装它,它与LD_LIBRARY_PATH.

于 2012-07-08T21:36:46.867 回答
0

Solaris 上的编译器支持-R /runtime/path/to/some/libs添加到运行时链接器搜索库的路径。在 Linux 上也可以使用-Wl,-rpath,/runtime/path/to/some/libs. 它将-rpath /runtime/path/to/some/libs选项传递给ld. GNUld还支持-R /path/to/libs与其他 ELF 链接器的兼容性,但应该避免这种情况,因为-R通常用于为 GNU 指定符号文件ld

于 2012-07-08T20:05:49.673 回答