7

我的项目链接到静态库 libA.a 版本 1。

此可执行文件还链接到另一个静态库 B。B 链接到 A,但版本 2。

A 的版本 1 和 2 中的两个符号集是相同的。如果我知道我的项目和 B 之间没有共享与 A 有任何关系的东西,这是否可行?

我设法手动链接它,它似乎工作(也许有我不知道的陷阱)。

我不能使 lib B 成为共享对象,或将 A 用作共享对象。实际上,我只知道 B 在静态使用 A,因为我与写 B 的人交谈过。

4

2 回答 2

3

我有待纠正,但似乎您可以通过仔细的编译过程和明智地使用 objcopy 来完成您想要的。您应该遵循的步骤是:

  1. 编译 A 的第 2 版。
  2. 针对 A2 编译库 B。
  3. 将 B 和 A2 合并到单个库 C 中(有关讨论,请参见此页面)。
  4. 通过使用 objcopy 创建 C2,本地化 A2 中存在于 C 中的所有符号。使用objcopy --localize-symbols infile outfile,并在此处查看详细信息。
  5. 编译 A 的版本 1。
  6. 编译您的应用程序 (P)。
  7. 链接 P A1 和 C2。

我在实践中从未这样做过,但所有构建块似乎都已到位。第 4 步是最难的,因为您必须识别所有冲突的符号——可能需要手动识别。

于 2012-12-18T11:27:43.267 回答
2

关于您问题的“链接”部分,实际上静态库没有链接在一起。仅执行链接步骤以获得最终的可执行文件。

实际上,您使用 A(版本 2)的标头编译了静态库 B。然后,您将可执行文件与 B 和 A(版本 1)库链接。

只要 A 的两个版本中的符号相同,就不存在编译问题。但是您必须知道您的可执行文件实际上只嵌入和使用 A 的版本 1。

于 2012-12-18T11:20:08.757 回答