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

Fre*_*son 19 linker gcc shared-libraries

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

gcc -o test test.o -L. -lmylib -Wl,-rpath=.
Run Code Online (Sandbox Code Playgroud)

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

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

gcc -o test test.o -lmylib -Wl,-rpath=.
/usr/bin/ld: cannot find -lmyLib
Run Code Online (Sandbox Code Playgroud)

但是,删除这两个标志是完全可以的.像这样:

gcc -o test test.o -lmylib
Run Code Online (Sandbox Code Playgroud)

前提是可以在/ usr/lib中找到libmyLib.为什么现在不需要-L?

这是/sf/answers/593761591/的后续问题.

OMG*_*chy 20

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

因此,-L需要指定要链接的文件的位置,就像-l指定特定库一样.在.表示当前目录.

-rpath当应用程序尝试加载动态库时,它会在运行时发挥作用.在尝试加载动态库时,它会向程序通知要搜索的其他位置.

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

  • 如果您考虑不为构建机器构建的场景(交叉编译或打包分发),那么这种区别就更有意义了。您可能需要告诉链接器在编译时在一个位置“-L/home/bob/proj/build/lib”中查找库,但在运行时在另一个位置“-rpath=/opt/proj/lib”中查找。 (5认同)

raa*_*hlb 5

澄清 OMGtechy 的答案。

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