考虑以下场景:
- 共享库 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
方法看起来好多了。
再次感谢。