GCC -rdynamic 不适用于静态库

标签 gcc static-libraries dynamic-linking

为什么 -rdynamic 不导出 .a 文件中的符号,而是导出 .o 文件中的符号?

我在 .so 文件中有一个应用程序和一个插件。主应用程序使用一系列目标文件和一个静态库进行链接,如下所示:

CXXFLAGS =      $(CXXFLAGS_COMMON) -rdynamic
STATICLIBS =    ../Utilities/Utilities.a
...

all:
    $(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES)

(CXX在Ubunut上是g++ 4.5.2,我主要用-std=c++Ox来编译)

在这种情况下,Utilities.a 中的符号不​​会导出(即“objdump -t a.out | grep 符号”为空)。

如果我使用“ar x”来提取 .a 中的 .o 文件并仅使用 .o 进行链接,那么这些符号将被插件导出并找到(如果您想知道,这些插件会使用 dlopen 加载)。

我曾尝试使用 -Wl,-export-dynamic 但没有成功。

如前所述,我确实有一个解决方法,但我仍然希望了解我缺少什么。提前致谢 !

最佳答案

通常,链接器只包含引用的静态文件(.a 文件)的那些部分。

要强制链接器包含 .a 文件的全部内容,您可以使用 --whole-archive 链接器选项(即 gcc 命令行上的 -Wl,--whole-archive)。

请注意, -Wl,--whole-archive 在命令行上是位置敏感的——它只影响命令行上跟在它后面的 .a 文件。如果您不希望完全包含更多静态文件,则可以随后使用 -Wl,--no-whole-archive 关闭其效果。

因此,例如,使用您的命令:

$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(SHAREDLIBS) $(INCLUDES)

关于GCC -rdynamic 不适用于静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6054942/

相关文章:

python - 在 pypy 翻译期间指定安装的 native 库路径

c - 使用 `ld -r` 并在符号丢失时出现编译错误

c - GCC - 将进程二进制文件恢复为 C

iOS 静态库私有(private)方法和属性

ubuntu - 我如何链接到 cppunit?

c++ - 不同库中的相同符号和链接顺序

c++ - 在 .o 文件中本地化函数体 block

c - 从二进制文件中读取 4 字节日期(大端)

c - 如何检查附加到可执行文件的静态库?

gcc - 如何将 -fvisibility 选项应用于静态库中的符号?