我的项目链接到静态库 libA.a 版本 1。
此可执行文件还链接到另一个静态库 B。B 链接到 A,但版本 2。
A 的版本 1 和 2 中的两个符号集是相同的。如果我知道我的项目和 B 之间没有共享与 A 有任何关系的东西,这是否可行?
我设法手动链接它,它似乎工作(也许有我不知道的陷阱)。
我不能使 lib B 成为共享对象,或将 A 用作共享对象。实际上,我只知道 B 在静态使用 A,因为我与写 B 的人交谈过。
我有待纠正,但似乎您可以通过仔细的编译过程和明智地使用 objcopy 来完成您想要的。您应该遵循的步骤是:
objcopy --localize-symbols infile outfile
,并在此处查看详细信息。我在实践中从未这样做过,但所有构建块似乎都已到位。第 4 步是最难的,因为您必须识别所有冲突的符号——可能需要手动识别。
关于您问题的“链接”部分,实际上静态库没有链接在一起。仅执行链接步骤以获得最终的可执行文件。
实际上,您使用 A(版本 2)的标头编译了静态库 B。然后,您将可执行文件与 B 和 A(版本 1)库链接。
只要 A 的两个版本中的符号相同,就不存在编译问题。但是您必须知道您的可执行文件实际上只嵌入和使用 A 的版本 1。