我有一堆非常复杂的lib和可执行文件(Linux)。整个系统在过去使用静态库开发,然后几年前lib被迁移到共享库(-fPIC等)。检查我发现的依赖关系,有两个共享库:libA和libB:
我想构建具有适当依赖关系的lib:libA依赖于libB而libB依赖于libA。但我无法给予" -llibB"到链接器,因为lib在libA的构建时尚未存在
如果我构建没有libB依赖的libA(创建未解析的符号),我必须记住,如果我使用libA,我还必须链接libB,因为libA中有未定义的符号。那是在做什么!
我正在寻找的是构建libA并告诉链接器创建依赖libB而不使用libB的可能性,这可能吗?
如果不将libA和libB合并在一起,如何解决我的问题?
此致 彼得斯
修改 我发现,我可以直接生成一个空的lib(无需编写源代码):
gcc -shared -Wl,-soname,libB.so.$(MAJOR) -o libB.so
然后我可以构建libA,将 -lB 添加到build命令中。之后我删除了libB.so. 最后,安装后libB引用libA,libA引用libB。
当然,MAJOR号码必须与libB的MAJOR匹配,这是因为主要号码对于所有lib都是通用的。
我只是问自己是否有更合适的方法来做这件事?
答案 0 :(得分:2)
共享库之间的依赖关系在加载时间之前不会解析,因此您可以使用以下行链接:
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选项实际上是一个非抱怨 - 未解决的符号标志,它允许构造一个没有所有已解析符号的ELF文件。
这里可能发生的另一件事是libreries没有安装。您正在尝试在没有正确路径的情况下执行它们,并在执行时获取未解析的符号(来自myProgram)。一种解决方案是使用以下命令运行myProgram:
LD_LIBRARY_PATH=. myProgram
或
export LD_LIBRARY_PATH=/path/to/libraries
myProgram
在linux中,库被缓存在系统数据库中,因此加载共享库很快。数据库由soname编制索引,要重新生成数据库,您必须以root身份使用命令 ldconfig(8)
ldconfig
其他环境可能根本不使用 ldconfig(8)(以solaris为例)