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

Why is -L needed when -rpath is used?

我发现使用-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

这是 的后续问题。

即使是动态库也需要一定程度的静态 linkage; linker 需要知道动态库应该提供什么符号。主要区别在于动态库在运行时提供定义,而完全静态库在 link 时间提供定义。

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

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

不需要指定 -L/usr/lib 的原因是因为 linker 默认在那里查找(因为这是放置库的非常常见的地方)。

OMGtechy 回答的澄清。

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