假设我想创建一个包含多个共享库的包 - 调用它libfoo
,其中包含liba.so.1
和libb.so.1
。现在,假设liba.so.1
使用来自 的符号libb.so.1
。如果我像这样编译,那么一切都OK:
cc -shared -fPIC -Wl,-soname,libb.so.1 -o libb.so.1 libb.c cc -shared -fPIC -Wl,-soname,liba.so.1 -o liba.so.1 liba.c libb.so.1
然而,这需要一些额外的工作(我必须手动找出依赖项并将它们编码到我的 makefile 中,而 scons 似乎不会自动执行此操作)。编译简单的方法会产生一个有趣的问题:
cc -shared -fPIC -Wl,-soname,libb.so.1 -o libb.so.1 libb.c cc -shared -fPIC -Wl,-soname,liba.so.1 -o liba.so.1 liba.c
现在其标头中liba.so.1
没有(使用可见),并且在构建 debian 包时我收到以下消息(并且此步骤需要更长的时间):libb.so.1
DT_NEEDED
objdump -p
dh_shlibdeps dpkg-shlibdeps:警告:在所有库中都找不到 debian/libfoo1/usr/lib/liba.so.1 使用的符号 b。
发生这种情况是因为符号b
是在 中定义的libb.so.1
,但dpkg-shlibdeps
无法知道这一点。
我应该注意到,这里似乎没有真正的问题 - 实际的二进制文件同时具有liba
和libb
as DT_NEEDED
,并且它们都在运行时加载......已经很多年了。这个问题仅在尝试创建一个正确的、干净构建的 debian 软件包时才会出现。
我应该如何解决这个问题? (应该我解决了这个问题?)这些库确实应该(TM)位于同一个 debian 包中。 (为了获得奖励积分,请解决循环依赖关系,即libb
还使用 中的符号liba
)。