【发布时间】:2011-06-16 15:42:23
【问题描述】:
我有一个静态 Objective-C++ 库 basic.a,带有一个函数 BasicFunction()。静态 Objective-C++ 库 foo.a 和 bar.a 依赖于 basic.a 并具有调用函数 Foo() 和 Bar() BasicFunction()。
这是棘手的部分:当我创建一个链接 foo.a 和 bar.a 的项目时,每个项目都在不同的时间构建,我想要 Foo()调用构建时存在的BasicFunction() 的版本,并调用构建时存在的Bar() 版本的BasicFunction()。 (这是为了使较新的库不会链接到缺少错误修复的旧 BasicFunction()。)
现在发生的情况是Foo() 和Bar() 都调用相同版本的BasicFunction(),即在foo.a 和bar 中的任何一个中。 a 在项目中首先链接。更改符号可见性似乎不起作用,因为如果 BasicFunction() 被隐藏,它会隐藏在 basic.a 中,并且 foo.a 或 无法看到bar.a.
如果没有好的方法让库调用不同版本的BasicFunction(),我至少要如何检测到问题?我尝试了一个哨兵类,它看起来确保它只被初始化一次,但链接器似乎将 basic.a 的不同版本中的两个哨兵优化为一个,再次来自任何一个库是先链接的。
【问题讨论】:
-
如果
BasicFunction应该始终是同一个函数,重构代码并链接到foo.a bar.a basic.a。如果foo.a和bar.a需要不同的基本功能实现,请给它不同的名称。 -
我稍微简化了这个故事 - 问题是几个月后分发的库正在使用缺少错误修复的 BasicFunction() 版本。
-
@Luke:嗯,我想我真的不明白你怎么能有 静态 链接库但仍然无法控制链接过程......不能你只是用新的、修正了错误的版本重新链接所有东西?
-
我们可以,只是不想在给客户 foo.a 时将 bar.a 重新分配给他们。他们应该能够在 foo.a 中进行链接,而不必担心它会调用旧代码。
-
这是链接器自诞生以来的工作方式。您需要确保 foo.a 和 bar.a 可以使用相同版本的
BasicFunction,并且链接了正确版本的 basic.a。
标签: c++ ios linker static-libraries static-linking