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但没有成功.
如上所述,我确实有一个解决方法,但我仍然希望了解我所缺少的内容.提前致谢 !
通常,链接器仅包括.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)
归档时间: |
|
查看次数: |
5334 次 |
最近记录: |