【发布时间】:2012-12-18 10:52:34
【问题描述】:
我的项目链接到静态库 libA.a 版本 1。
此可执行文件还链接到另一个静态库 B。B 链接到 A,但版本 2。
A 的版本 1 和 2 中的两个符号集是相同的。 如果我知道我的项目和 B 之间没有共享任何与 A 相关的内容,这是否可行?
我设法手动链接它,它似乎工作(也许有我不知道的陷阱)。
我无法将库 B 设为共享对象,或将 A 用作共享对象。实际上,我只知道 B 静态使用 A 是因为我和写 B 的人交谈过。
【问题讨论】:
-
你想知道这是否是一个好主意(它不是),或者对于特定的静态库(这是?),或者如何修复你的构建系统(失败怎么样?)...
-
我认为你在这里一次问了太多问题。我会就多个版本提出这个问题,并就 CMake 方面提出一个单独的问题。
-
您确定您的手动链接有效吗?链接器更有可能静默(甚至非静默)抑制两个库之一的冲突符号。
-
我认为这只有在库 B 是共享库的情况下才能可靠地工作。这样,它就可以使用它喜欢的任何版本。
-
您可以通过运行
nm或objdump来检查生成的二进制文件,并将其与两个静态库的输出进行比较。应该可以看到你最终使用了谁的符号。