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不需要指定的原因是因为默认情况下链接器在那里查找(因为这是放置库的一个非常常见的地方).
澄清 OMGtechy 的答案。
如果链接器不检查库提供了哪些符号,它永远不会告诉您在编译时是否缺少任何符号。它们可能位于运行时加载的库之一中。你永远不可能知道。库的头文件和 .so 文件在编译时没有联系。