相关疑难解决方法(0)

使用依赖项链接动态库

请考虑以下情形:

  • 共享库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
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方法看起来好多了.

再次感谢.

dll dependencies gcc g++

69
推荐指数
2
解决办法
4万
查看次数

标签 统计

dependencies ×1

dll ×1

g++ ×1

gcc ×1