C 如何将共享对象(.so)和静态库(.a)组合成新的共享对象?

C 如何将共享对象(.so)和静态库(.a)组合成新的共享对象?,c,linux,C,Linux,我有一个图书馆;称之为libdog.so。 我没有libdog.so的源代码。 我没有进入libdog.so的.o文件 ldd libdog.so libdogfood.so.1 => not found libdog依赖libdog的食物。 我有一个静态狗粮库,libdogfood.a和libdogfood.la 我想创建一个新库,libcompletedog.so,它没有 对食物的依赖 我希望LIB完全包含LIB食品中的所有符号。 < P>大多数UNIX系统(AIX是例外)考虑。所以

我有一个图书馆;称之为libdog.so。 我没有libdog.so的源代码。 我没有进入libdog.so的
.o
文件

ldd libdog.so
libdogfood.so.1 => not found
libdog依赖libdog的食物。 我有一个静态狗粮库,
libdogfood.a
libdogfood.la

我想创建一个新库,
libcompletedog.so
,它没有 对食物的依赖

我希望LIB完全包含LIB食品中的所有符号。

< P>大多数UNIX系统(AIX是例外)考虑<代码>。所以< /Cord>库是链接的“最终”产品,不能再链接到其他东西。

如果您的
libdogfood.a
是32位库,则可以将其链接到
libdogfood.so.1
,从而满足缺少的依赖项:

gcc -shared -o libdogfood.so.1 \
 -Wl,--whole-archive libdogfood.a -Wl,--no-whole-archive

如果
libdogfood.a
包含64位对象,上面的方法可能仍然有效(如果对象是用
-fPIC
编译的),但这不太可能。基本上你不能这样做,因为
libdog.a
是用
-fPIC
编译的,而
libdogfood.a
不是。共享库(实际上)只需要包含
(否则它们里面有太多的重新定位信息)

我不确定,但这里右边的“相关”问题肯定有一些相关的问题。AFAIK
-fPIC
在32位或64位中起着重要作用。即使
libdogfood.a
是一个32位库,如果其中的对象部分是在没有
-fPIC
的情况下编译的,那么这可能不起作用。@other.anon.coward
-fPIC
也在32位二进制文件中发挥作用,但您可以从没有
-fPIC
编译的对象构建一个32位共享库。但是你不能对64位二进制文件做同样的操作。哦,是吗?我过去在32位库上遇到过问题。也许如果我再次遇到,我会发布一些东西。谢谢你提供的信息!原则上确实不正确,但实际上是正确的。你真的不想在非PIC*中有太多的搬迁信息。所以