C 当有'LD\u LIBRARY\u PATH'时,使用'-L'有什么意义?

C 当有'LD\u LIBRARY\u PATH'时,使用'-L'有什么意义?,c,linux,gcc,linker,C,Linux,Gcc,Linker,阅读后,我的第一反应是用户没有看到错误,因为他用-L指定了库的位置 但是,显然,-L选项只影响链接器的外观,而不影响加载程序在您尝试运行编译后的应用程序时的外观 那么我的问题是-L的意义是什么?既然除非在LD\u LIBRARY\u PATH中有正确的目录,否则无法运行二进制文件,为什么不首先将它们放在那里,然后删除-L,由于链接器会自动在LD\u LIBRARY\u PATH中查找?可能是您在交叉编译,而链接器的目标不是您自己的系统。例如,MinGW可以用于在Linux上编译Windows二进

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

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


那么我的问题是
-L
的意义是什么?既然除非在
LD\u LIBRARY\u PATH
中有正确的目录,否则无法运行二进制文件,为什么不首先将它们放在那里,然后删除
-L
,由于链接器会自动在
LD\u LIBRARY\u PATH
中查找?

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


在尝试建立特殊目标时,它也很有用。我可能是这样的:一个链接程序的静态版本和另一个静态库。这是Linux从无到有的第一步,在主系统上创建一个单独的迷你环境,成为
chroot
jail。

设置
LD\u LIBRARY\u PATH
将影响构建代码所运行的所有命令(包括编译器本身)

这在一般情况下是不可取的(例如,您可能不希望编译器在编译时运行调试/插入指令的库,甚至可能破坏编译器)


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

构建二进制文件和运行二进制文件是两个完全独立和不相关的过程。您似乎建议运行环境应影响构建环境,即您似乎假设某些设置(帐户、计算机)中的代码构建稍后将在同一设置中运行。我觉得这个假设很奇怪。我甚至可以说,在大多数情况下,构建和运行都是在不同的环境中完成的。实际上,我希望我的编译器不要从调用这些编译器的环境中派生出任何关于未来运行环境的假设。查看构建环境的
LD\u LIBRARY\u路径
将是一个主要问题。

Solaris上的编译器支持
-R/runtime/PATH/to/some/libs
,它添加到运行时链接器搜索库的路径中。在Linux上,使用
-Wl、-rpath、/runtime/path/to/some/libs可以实现同样的效果。它将
-rpath/runtime/path/to/some/libs
选项传递给
ld
。GNU
ld
还支持
-R/path/to/libs
以与其他ELF链接器兼容,但这应该避免,因为
-R
通常用于为GNU
ld

指定符号文件。其他答案都很好,但没有人提到的是静态库。大多数情况下,当您使用
-L
时,它是在您的构建树中本地构建的静态库,您不打算安装它,并且它与
LD\u library\u PATH

无关。在绝大多数情况下,您将构建您的程序,然后您将希望在自己的机器上测试它(很明显,您可能会在以后将其发送给其他人,但通常还是会首先在您的机器上进行测试)。因此,您必须相应地设置
LD_LIBRARY_PATH
。因此使用
-L
将是多余的,没有?@houbysoft LD_LIBRARY_PATH也会影响编译器的运行时间。任何其他用于构建二进制文件的工具。您希望保持构建环境的原始性和同质性,而不是改变编译器的参数。Also、 LD\u LIBRARY\u PATH不能用于静态库。@houbysoft:我确实在“我自己的机器”上测试我的二进制文件在运输之前,这当然不是机器建造的机器,或者至少不是用于建筑的环境。事实上,我考虑使用相同的环境来构建和测试一个主要的错误,原因多于一个。