【问题标题】:Keeping symbols from different builds of static libraries separate将来自不同静态库版本的符号分开
【发布时间】:2011-06-16 15:42:23
【问题描述】:

我有一个静态 Objective-C++ 库 basic.a,带有一个函数 BasicFunction()。静态 Objective-C++ 库 foo.abar.a 依赖于 basic.a 并具有调用函数 Foo()Bar() BasicFunction()

这是棘手的部分:当我创建一个链接 foo.abar.a 的项目时,每个项目都在不同的时间构建,我想要 Foo()调用构建时存在的BasicFunction() 的版本,并调用构建时存在的Bar() 版本的BasicFunction()。 (这是为了使较新的库不会链接到缺少错误修复的旧 BasicFunction()。)

现在发生的情况是Foo()Bar() 都调用相同版本的BasicFunction(),即在foo.abar 中的任何一个中。 a 在项目中首先链接。更改符号可见性似乎不起作用,因为如果 BasicFunction() 被隐藏,它会隐藏在 basic.a 中,并且 foo.a 无法看到bar.a.

如果没有好的方法让库调用不同版本的BasicFunction(),我至少要如何检测到问题?我尝试了一个哨兵类,它看起来确保它只被初始化一次,但链接器似乎将 basic.a 的不同版本中的两个哨兵优化为一个,再次来自任何一个库是先链接的。

【问题讨论】:

  • 如果BasicFunction应该始终是同一个函数,重构代码并链接到foo.a bar.a basic.a。如果foo.abar.a 需要不同的基本功能实现,请给它不同的名称。
  • 我稍微简化了这个故事 - 问题是几个月后分发的库正在使用缺少错误修复的 BasicFunction() 版本。
  • @Luke:嗯,我想我真的不明白你怎么能有 静态 链接库但仍然无法控制链接过程......不能你只是用新的、修正了错误的版本重新链接所有东西?
  • 我们可以,只是不想在给客户 foo.a 时将 bar.a 重新分配给他们。他们应该能够在 foo.a 中进行链接,而不必担心它会调用旧代码。
  • 这是链接器自诞生以来的工作方式。您需要确保 foo.a 和 bar.a 可以使用相同版本的 BasicFunction,并且链接了正确版本的 basic.a。

标签: c++ ios linker static-libraries static-linking


【解决方案1】:

嗯,其他人不太可能遇到这个特殊问题,但解决方案是从一个普通的 C 函数调用一个 Objective-C 哨兵类,每个构建都有唯一的名称,由每个库调用。 sentinel 类确保在运行时只有一个具有其名称的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2018-12-16
    • 2015-10-18
    相关资源
    最近更新 更多