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

时间:2011-12-03 03:22:32

标签: c linux

我有一个图书馆;称之为libdog.so。 我没有libdog.so的来源。 我没有进入.o的{​​{1}}个文件。

libdog.so

libdog取决于libdogfood。 我有一个静态dogfood库,ldd libdog.so libdogfood.so.1 => not found libdogfood.a

我想创建一个新的库libdogfood.la,它没有 对libdogfood的依赖。

我希望libcompletedog包含libdogfood中的所有符号。

2 个答案:

答案 0 :(得分:2)

大多数UNIX系统(AIX都是例外)认为.so库是链接的“最终”产品,不能重新链接到其他东西。

如果您的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编译的),但这有点不太可能。

答案 1 :(得分:0)

基本上你不能这样做,因为libdog.so是用-fPIC编译的,而libdogfood.a则不是。共享库(实际上)只需要包含position independent code (否则内部的重定位信息太多)