最佳答案
考虑以下场景:
我想编译一个与 libB 链接的二进制文件。 我应该只用 libB 链接二进制文件还是用 libA 链接二进制文件?
有没有办法只与直接依赖项链接,让运行时的依赖项解析未解析的符号?
我担心将来库 libB 实现可能会发生变化,引入其他依赖项(例如 libC、 libD、 libE)。我会有问题吗?
换句话说:
当然,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 中未解析的符号。但我觉得有点奇怪。
非常感谢。
——更新评论:
当我链接二进制文件时,链接器将尝试解析 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
方法看起来要好得多。
再次感谢。