考虑以下情形:动态链接库具有依赖性
- 共享库libA.so,无依赖性。
- 共享库libB.so,libA.so作为其依赖项。
我想编译一个与libB链接的二进制文件。 我应该只用libB还是用libA链接二进制文件?
是否有任何方法只与直接依赖链接,让从运行时依赖的解决未解决的符号?
我担心库libB实现可能会在将来发生变化,引入其他依赖关系(例如libC,libD,libE)。我会遇到问题吗?
换句话说:
- 力霸文件:a.cpp啊
- libB文件:b.cpp BH
- 主程序文件:main.cpp中
当然, b.cpp包含ah和main.cpp包含bh
编译命令:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
我应该使用哪波纹管的选择?
g++ main.cpp -o main -I. -L. -lB
或
g++ main.cpp -o main -I. -L. -lB -lA
我不能使用第一个选项。链接器抱怨来自库libA的未解析符号。但这听起来有点奇怪。
非常感谢。
- 更新注释:
当我链接的二进制文件,链接器将尝试解决从主和libB所有符号。但是,libB具有来自libA的未定义符号。这就是连接器抱怨的原因。
这就是为什么我需要与libA链接。 但是我发现了一种方法来忽略来自共享库的未解析符号。 看起来我应该使用以下命令行来做到这一点:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
看起来它仍然可以使用-rpath
选项。 但是我需要更好地理解它。
使用-Wl,-unresolved-symbols=ignore-in-shared-libs
选项时,有谁知道任何可能的陷阱?
- 更新注释2:
-rpath
不应该被用于此目的。强制在给定目录中找到库是有用的。 -unresolved-symbol
方法看起来好多了。
再次感谢。
我知道这是很久以前,我忘记标记为已解决。非常感谢您的回答。] – Marcus
谢谢大家的惊人的问题,和一个合适的答案!我有几乎完全相同的情况。我试图将openCV共享对象包装在自定义共享对象中。可以说C.so是我的习惯,所以CV.so就是一些openCV。我已经成功地链接了C.so和CV.so,并且我想将一个main.cpp(你可以!)链接到C.so,但是除了使用C.so的对象之外,main.cpp使用了一个在CV.so中定义的对象'cv :: Mat'。在这种情况下,main.cpp运行时是否需要链接C.so和CV.so?如果有人对此有所了解,我很乐意。谢谢! :) –
为什么链接程序在生成libB.so时不能解析所有需要的libA.so符号? 主应用程序不应链接到libA,因为它应该是透明的,例如,间接由libB屏蔽? – Wilson