请考虑以下情形:
- 共享库libA.so,没有依赖项。
- 共享库libB.so,依赖项为libA.so。
我想编译一个与libB链接的二进制文件。我应该仅将二进制文件与libB链接,还是与libA链接?
有什么方法只能与直接依赖项链接,从而使依赖项中的未解析符号解析为运行时吗?
我担心库libB的实现将来可能会改变,引入了其他依赖项(例如libC,libD,libE)。我会遇到问题吗?
换一种说法:
- libA文件: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中有未解析的符号。但这对我来说有点奇怪。
非常感谢。
-更新的评论:
当我链接二进制文件时,链接器将尝试解析main和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
方法看起来好多了。
再次感谢。