保持来自不同构建的静态库的符号分开

时间:2011-06-16 15:42:23

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

我有一个静态的Objective-C ++库 basic.a ,函数为BasicFunction()。静态Objective-C ++库 foo.a bar.a 依赖于 basic.a 并具有函数Foo()和{{1调用Bar()

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

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

如果没有好的方法让库调用BasicFunction()的不同版本,我怎么能至少检测到这个问题?我已经尝试了一个哨兵类,它确保它只被初始化一次,但是链接器似乎只是将 basic.a 的不同构建中的两个哨兵优化为一个,再次来自哪个库首先是联系在一起。

1 个答案:

答案 0 :(得分:0)

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