我有一堆非常复杂的lib和可执行文件(Linux)。整个系统在过去是使用静态库开发的,几年前libs被迁移到共享库(fPIC等)。检查我发现的依赖项,有两个共享lib:libA和libB:
libA从libB调用一些函数
libB从libA调用一些函数
我希望构建具有适当依赖性的libs:libA依赖于libB,libB依赖于libA。但是我不能给链接器“-LILBB”,因为LIB在LIBA构建时还不存在。
如果我在不依赖libB(创建未解析符号)的情况下构建libA,我必须记住如果我使用libA,我还必须链接libB,因为libA中的符号未定义。那是不可能的!
我所寻找的是建立libA的可能性,并告诉链接器创建对libB的依赖性,而此时没有libB,这可能吗?
如果不将libA和libB合并在一起,如何解决我的问题?
当做,
彼得斯
编辑:
我发现,我可以直接生成一个空库(无需编写源代码):

gcc -shared -Wl,-soname,libB.so.$(MAJOR) -o libB.so

然后我可以构建libA,在build命令中添加-lB。之后我删除了libB.so。
最后,在安装之后,libB引用libA,libA引用libB。
当然,专业编号必须与libB的专业相匹配,这是事实,因为专业编号对于所有lib都是通用的。
我只是在问自己,有没有更合适的方法?

最佳答案

在加载之前,共享库之间的依赖关系不会被解析,因此您可以使用以下行进行链接:

gcc -shared -Wl,-soname,libA.so.$(AMAJOR) -o libA.so
gcc -shared -Wl,-soname,libB.so.$(BMAJOR) -o libB.so

然后
gcc -o myProgram a.o b.o c.o libA.so libB.so

加载(运行)myProgram时,动态加载程序将跟踪未满足的依赖项,并在两个共享对象中查找符号。shared选项实际上是一个不抱怨unresolved symbols标志,它允许在不使用所有已解析符号的情况下构造ELF文件。
这里可能发生的另一件事是没有安装libreries。您试图在没有正确路径的情况下执行它们,并在执行时获取未解析的符号(来自myProgram)。一种解决方案是使用以下命令运行myProgram:
LD_LIBRARY_PATH=. myProgram


export LD_LIBRARY_PATH=/path/to/libraries
myProgram

在linux中,库缓存在系统数据库中,因此加载共享库很快。数据库由soname索引,要重新生成数据库,必须使用命令ldconfig(8)作为根目录
ldconfig

其他环境可能根本不使用ldconfig(8)(以solaris为例)

10-06 07:49