如何在没有重复符号错误的情况下跨静态库共享代码?

时间:2012-07-10 03:12:06

标签: objective-c xcode architecture linker

我是构建静态库的新手,并且想创建2个(+)库,每个库都有一些独特的代码和一些共享代码。我的意图是其他项目将链接一个或多个这些静态库。

Util.h/m  <-- Shared
ImplOne.h/m  <-- Unique to 'ImplOne'
ImplTwo.h/m  <-- Unique to 'ImplTwo'

我正在使用XCode并通过在一个案例中构建Util.mImplOne.m以及在另一个案例中构建Util.mImplTwo.m来生成库。

当然问题是我现在不能将这些库一起使用,因为它们会有重复的符号。对于这种情况,什么是更好的架构?

2 个答案:

答案 0 :(得分:3)

我认为最干净的选择是为共享的Utils.h/m创建一个单独的库。缺点是您的用户需要将utilsimplone和/或impltwo相关联,以便将impooneimpltwo链接在一起库需要使用相同版本的utils进行编译。作为回报,图书馆的来源将保持良好和干净。

另一种方法是使用宏来改变utils中的函数和变量名,以避免链接器错误。最重要的后果是代码重复:imploneimpltwo都会以不同的名称链接相同的代码片段。另一个是可读性:它将遭受巨大的损失,因为utils中对函数的每个引用都需要包含在宏中。这使第二种方法变脏,所以我肯定会建议将utils作为一个单独的库。

答案 1 :(得分:2)

我在当前的代码库中遇到了类似的问题。我的解决方案类似于我写这篇文章时得到的答案,但我会把它留在这里作为比较/参考。

我有一个常见的静态库项目(我们称之为libCommonBits.a)。我有一个第二个静态库,其中包含一些UI代码(让我们称之为libCommonUI.a),这也取决于libCommonBits.a。我的主应用程序需要使用这两个库。

我的解决方案是不将libCommonBits.a实际链接到libCommonUI.a中。它可以很好地编译头文件,只是意味着我的主应用程序链接两个静态库而不是一个。

我希望更多人分发图书馆能够采用这种方法。当您使用已经在公共库(JSONKit或类似)中链接的静态库时,这是令人沮丧的,并且您还在代码库中单独使用它。在这种情况下,符号重命名可能是唯一的解决方案。