为什么在使用-rpath时需要-L?

时间:2015-01-22 18:29:03

标签: gcc linker shared-libraries

我发现在使用-rpath时必须给出-L标志。例如:

gcc -o test test.o -L. -lmylib -Wl,-rpath=.

为什么需要-L标志? 编译时间需要哪些信息比h文件中的信息更多?

如果我删除-L。我收到以下消息:

gcc -o test test.o -lmylib -Wl,-rpath=.
/usr/bin/ld: cannot find -lmyLib

尽管如此,删除这两个标志是完全可以的。像这样:

gcc -o test test.o -lmylib

如果可以在/ usr / lib中找到libmyLib,那就是。为什么现在不需要-L?

这是https://stackoverflow.com/a/8482308/1091780的后续问题。

2 个答案:

答案 0 :(得分:19)

即使是动态库也需要一定程度的静态链接;链接器需要知道动态库应该提供哪些符号。关键的区别在于动态库在运行时提供定义,而完全静态库在链接时提供定义。

出于这个原因,需要-L来指定要链接的文件的位置,就像-l指定特定的库一样。 .表示当前目录。

当应用程序尝试加载动态库时,

-rpath在运行时发挥作用。它会在尝试加载动态库时通知程序另一个要搜索的位置。

不需要指定-L/usr/lib的原因是因为默认情况下链接器在那里查找(因为这是放置库的一个非常常见的地方)。

答案 1 :(得分:4)

澄清OMGtechy的答案。

如果链接器没有检查库提供了哪些符号,则它永远无法告诉您编译时是否缺少任何符号。它们可能位于运行时加载的库之一中。你永远不会知道。编译时在库的头文件和.so文件之间没有连接。