为什么在使用 -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文件在编译时是没有联系的
我发现使用-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文件在编译时是没有联系的