我是构建静态库的新手,并且想创建2个(+)库,每个库都有一些独特的代码和一些共享代码。我的意图是其他项目将链接一个或多个这些静态库。
Util.h/m <-- Shared
ImplOne.h/m <-- Unique to 'ImplOne'
ImplTwo.h/m <-- Unique to 'ImplTwo'
我正在使用XCode并通过在一个案例中构建Util.m
和ImplOne.m
以及在另一个案例中构建Util.m
和ImplTwo.m
来生成库。
当然问题是我现在不能将这些库一起使用,因为它们会有重复的符号。对于这种情况,什么是更好的架构?
答案 0 :(得分:3)
我认为最干净的选择是为共享的Utils.h/m
创建一个单独的库。缺点是您的用户需要将utils
与implone
和/或impltwo
相关联,以便将impoone
和impltwo
链接在一起库需要使用相同版本的utils
进行编译。作为回报,图书馆的来源将保持良好和干净。
另一种方法是使用宏来改变utils
中的函数和变量名,以避免链接器错误。最重要的后果是代码重复:implone
和impltwo
都会以不同的名称链接相同的代码片段。另一个是可读性:它将遭受巨大的损失,因为utils
中对函数的每个引用都需要包含在宏中。这使第二种方法变脏,所以我肯定会建议将utils
作为一个单独的库。
答案 1 :(得分:2)
我在当前的代码库中遇到了类似的问题。我的解决方案类似于我写这篇文章时得到的答案,但我会把它留在这里作为比较/参考。
我有一个常见的静态库项目(我们称之为libCommonBits.a)。我有一个第二个静态库,其中包含一些UI代码(让我们称之为libCommonUI.a),这也取决于libCommonBits.a。我的主应用程序需要使用这两个库。
我的解决方案是不将libCommonBits.a实际链接到libCommonUI.a中。它可以很好地编译头文件,只是意味着我的主应用程序链接两个静态库而不是一个。
我希望更多人分发图书馆能够采用这种方法。当您使用已经在公共库(JSONKit或类似)中链接的静态库时,这是令人沮丧的,并且您还在代码库中单独使用它。在这种情况下,符号重命名可能是唯一的解决方案。