3

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

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

我正在使用 XCode 并通过构建和生成库Util.mImplOne.m在一种情况下,在另一种情况Util.mImplTwo.m

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

4

2 回答 2

3

我认为最干净的选择是为共享的Utils.h/m. 缺点是您的用户需要utilsimplone和/或一起链接,并且impltwo为了将两个库链接在一起并需要使用相同版本的. 作为回报,库的源代码将保持干净整洁。impooneimpltwoutils

另一种方法是使用宏来更改 中的函数和变量名称,utils以避免链接器错误。这样做最重要的后果是代码重复:两者implone都会impltwo链接不同名称的相同代码段。另一个是可读性:它会受到极大的影响,因为每个对函数的引用utils都需要包装在一个宏中。这使得第二种方法很脏,所以我肯定会建议制作utils一个单独的库。

于 2012-07-10T03:33:12.250 回答
2

我在当前的代码库中有类似的问题。我的解决方案类似于我写这篇文章时刚刚出现的答案,但我将把它留在这里作为比较/参考。

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

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

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

于 2012-07-10T03:39:11.827 回答