为什么 -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/