共享库 libA.so ,没有依赖关系。
共享库 libB.so,以 libA.so 为其依赖项。
我想编译一个链接到 libB 的二进制文件。 我应该只链接二进制文件和 libB 还是同时链接 libA?
是否有一种方法只与直接依赖项链接,让未解决的符号从依赖项中的运行时解析?
我担心库 libB 的实现将来可能会发生更改,引入其他依赖项(例如 libC、libD、libE)。我会遇到问题吗?
换句话说: libA 文件:a.cpp a.h libB 文件:b.cpp b.h 主程序文件:main.cpp 当然,b.cpp 包括 a.h,而 main.cpp 包括 b.h。
编译命令:
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
方法看起来更好。
再次感谢。