C 如何将共享对象(.so)和静态库(.a)组合成新的共享对象?
我有一个图书馆;称之为libdog.so。 我没有libdog.so的源代码。 我没有进入libdog.so的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是例外)考虑。所以
.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*中有太多的搬迁信息。所以