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

标签 gcc linker shared-libraries

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

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现在需要吗?

这是 https://stackoverflow.com/a/8482308/1091780 的后续问题.

最佳答案

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

为此,-L需要指定要链接的文件的位置,就像 -l指定特定的库。 .表示当前目录。
-rpath在运行时开始发挥作用,当应用程序尝试加载动态库时。当尝试加载动态库时,它会通知程序要搜索的附加位置。

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

关于gcc - 为什么在使用 -rpath 时需要 -L?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28096133/

相关文章:

c - 如何在glibc源代码(malloc/morecore.c)中调用librt中的函数(shm_open)?

c++ - 跨 DLL/共享库使用命名空间

c++ - 我可以定义一个结构,其对象将始终位于单独的缓存行中吗

c++ - GCC comp_except_specs 和异常处理/解析

Ubuntu未定义引用错误

c - 编译C时如何链接文件夹中的所有目标文件?

c - 当长度大于 4GB 时 mmap 失败

c++ - 链接 CUDA 和 C++ : Undefined symbols for architecture i386

boost - CMake:如何从目标链接列表中删除重复项?

C++ 捕获枚举值作为异常