我发现在使用-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?
答案 0 :(得分:19)
即使是动态库也需要一定程度的静态链接;链接器需要知道动态库应该提供哪些符号。关键的区别在于动态库在运行时提供定义,而完全静态库在链接时提供定义。
出于这个原因,需要-L
来指定要链接的文件的位置,就像-l
指定特定的库一样。 .
表示当前目录。
-rpath
在运行时发挥作用。它会在尝试加载动态库时通知程序另一个要搜索的位置。
不需要指定-L/usr/lib
的原因是因为默认情况下链接器在那里查找(因为这是放置库的一个非常常见的地方)。
答案 1 :(得分:4)
澄清OMGtechy的答案。
如果链接器没有检查库提供了哪些符号,则它永远无法告诉您编译时是否缺少任何符号。它们可能位于运行时加载的库之一中。你永远不会知道。编译时在库的头文件和.so文件之间没有连接。