C++ 将不同版本的静态库中的符号分开

C++ 将不同版本的静态库中的符号分开,c++,ios,linker,static-libraries,static-linking,C++,Ios,Linker,Static Libraries,Static Linking,我有一个静态Objective-C++库basic.a,其中包含一个函数BasicFunction()。静态Objective-C++库foo.a和bar.a依赖于basic.a,并具有调用BasicFunction()的函数foo()和bar() 这里有一个棘手的部分:当我创建一个链接到foo.a和bar.a的项目时,每个项目都在不同的时间构建,我希望foo()调用构建时存在的BasicFunction()版本,并bar()调用BasicFunction()版本它建成时就在那里。(这样新的库就

我有一个静态Objective-C++库basic.a,其中包含一个函数
BasicFunction()
。静态Objective-C++库foo.abar.a依赖于basic.a,并具有调用
BasicFunction()
的函数
foo()
bar()

这里有一个棘手的部分:当我创建一个链接到foo.abar.a的项目时,每个项目都在不同的时间构建,我希望
foo()
调用构建时存在的
BasicFunction()
版本,并
bar()
调用
BasicFunction()版本
它建成时就在那里。(这样新的库就不会链接到缺少bug修复的旧
BasicFunction()

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


如果没有好方法让库调用不同版本的
BasicFunction()
,我至少该如何检测问题?我尝试了一个sentinel类,看起来它只能初始化一次,但是链接器似乎将不同版本的basic.a中的两个sentinel优化为一个,再次从最先链接的库中进行优化。

好吧,其他人不太可能会有这个问题,但解决方案是使用普通C函数调用Objective-C sentinel类,每个库调用的每个构建都有唯一的名称。sentinel类确保在运行时只有一个实例具有其名称。

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