假设我想创建一个动态库dynamic.so
,但我的代码引用了一个存在于其他静态库static.a
中的函数。当然,如果我编译并链接g++
和-shared
选项,dynamic.so
将期望引用的函数在一些其他动态库中实现,我必须在运行时将其与dynamic.so
。换句话说,只要我-l static
(模数语法),它就会很开心。
但由于其他库实际上是静态的,我不能这样做。假设我无法在主程序的编译时链接静态库,但我不得不使用动态库。所以我真正想要的是将static.a
中dynamic.so
引用函数的编译代码包含在内。
This answer相关问题建议使用--whole-archive
选项在static.a
中加入dynamic.so
。但是,就我而言,static.a
是巨大的。而且我真的不需要全部,我只需要一个函数定义。
This answer另一个问题解释了在编译时链接到静态库意味着只有实际引用的代码才会包含在二进制文件中。好吧,这正是我想为我的单一功能参考做的事情!我真的不想在那里使用整个静态存档。
但我怎么能实现呢?如何在static.a
中仅包含dynamic.so
所需的部分?
答案 0 :(得分:1)
您不需要--whole-archive
:只需链接您的dynamic.so
:
gcc -shared -fPIC -o dynamic.so $(OBJS) -lstatic
这将进入dynamic.so链接器需要的任何内容libstatic.a.
请参阅this explanation以了解其原因。
一个问题可能是您的libstatic.a
编译时没有-fPIC
。在32位x86/Linux
上,这仍然可以工作(尽管如果多个进程正在使用它,你的库将无法为你节省大量内存)。在x86_64
上,将非fPIC代码链接到共享库无法使用,因此您必须使用-fPIC
重建它。