请考虑以下情形:
我想编译一个与libB链接的二进制文件.我应该仅将二进制文件与libB或libA链接?
有没有办法只链接直接依赖关系,让运算符的依赖关系解析未解析的符号?
我担心库libB实现将来可能会发生变化,引入其他依赖项(例如libC,libD,libE).我会遇到问题吗?
换一种说法:
当然,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
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种波纹管选项?
g++ main.cpp -o main -I. -L. -lB
Run Code Online (Sandbox Code Playgroud)
要么
g++ main.cpp -o main -I. -L. -lB -lA
Run Code Online (Sandbox Code Playgroud)
我无法使用第一个选项.链接器抱怨库libA中未解析的符号.但这听起来有点奇怪.
非常感谢.
- 更新评论:
当我链接二进制文件时,链接器将尝试解析main和libB中的所有符号.但是,libB具有来自libA的未定义符号.这就是链接器抱怨的原因.
这就是我需要与libA联系的原因.但是我发现了一种忽略共享库中未解析符号的方法.看起来我应该使用以下命令行来做到这一点:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Run Code Online (Sandbox Code Playgroud)
看起来仍然可以使用该-rpath选项.但是我需要更好地理解它.
有没有人知道使用该-Wl,-unresolved-symbols=ignore-in-shared-libs选项时可能存在的任何陷阱?
- 更新评论2:
-rpath不应该用于此目的.强制在给定目录中找到库是很有用的.这种-unresolved-symbol方法看起来好多了.
再次感谢.