GCC -rdynamic不能使用静态库

J.N*_*.N. 4 gcc dynamic-linking static-libraries

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

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

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

all:
    $(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES)
Run Code Online (Sandbox Code Playgroud)

(CXX是Ubunut上的g ++ 4.5.2,我主要使用-std = c ++ Ox进行编译)

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

如果我使用"ar x"来仅仅使用.o来提取.a和.链接中的.o文件,那么这些符号将被插件导出并找到(如果你想知道的话加载了dlopen).

我尝试过使用-Wl,-export-dynamic但没有成功.

如上所述,我确实有一个解决方法,但我仍然希望了解我所缺少的内容.提前致谢 !

sno*_*rpe 9

通常,链接器仅包括.a引用的静态归档(文件)的那些部分.

要强制链接器包含.a文件的全部内容,可以使用--whole-archive链接器选项(-Wl,--whole-archive在gcc命令行中也是如此).

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

所以,例如,使用您的命令:

$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(SHAREDLIBS) $(INCLUDES)
Run Code Online (Sandbox Code Playgroud)