考虑以下场景:
- 共享库 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
or
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
option?
-- 更新评论2:
-rpath
不应该用于此目的。强制在给定目录中找到库很有用。这-unresolved-symbol
方法看起来好多了。
再次感谢。