1

假设我想创建一个动态库dynamic.so,但我的代码引用了一个存在于其他静态库中的函数static.a。自然地,如果我编译并使用g++-shared选项链接,dynamic.so将期望引用的函数在其他一些动态库中实现,我必须在运行时将其与dynamic.so. 换句话说,只要我这样做就会很高兴-l static(模数语法)。

但是由于那个其他库实际上是一个静态库,所以我不能这样做。假设我也无法在主程序的编译时链接静态库,但我被迫只使用动态库。所以我真正想要的是从static.ain 中包含引用函数的编译代码dynamic.so

这个对相关问题的回答建议使用--whole-archive包含static.adynamic.so. 但是,就我而言,static.a是巨大的。而且我真的不需要全部,我只需要一个函数定义。

This answer to another question解释了在编译时链接到静态库意味着只有实际引用的代码才会包含在二进制文件中。好吧,这正是我想要为我的单个函数参考做的!我真的不想要整个静态档案在那里。

但我怎样才能做到这一点?如何仅包含static.ain的必需部分dynamic.so

4

1 回答 1

1

你不需要:只需像这样--whole-archive链接你:dynamic.so

gcc -shared -fPIC -o dynamic.so $(OBJS) -lstatic

这将拉入 dynamic.so 链接器需要的任何内容,libstatic.a.请参阅此说明以了解原因。

一个问题可能是您libstatic.a的编译没有-fPIC. 在 32-bitx86/Linux上,这仍然可以工作(尽管如果多个进程正在使用它,您的库不会为您节省太多 RAM)。在 上x86_64,无法将非 fPIC 代码链接到共享库,因此您必须使用-fPIC.

于 2011-12-07T05:34:08.533 回答