如何跨静态库共享代码而不出现重复符号错误?
我是新来建立静态库,并希望创建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
。
当然,问题是我现在不能将这些库一起使用,因为它们会有重复的符号。对于这种情况,什么是更好的架构?
我认为最简洁的选择是为共享的Utils.h/m
制作一个单独的库。缺点是您的用户需要链接utils
以及implone
和/或impltwo
,并且为了将impoone
和impltwo
链接在一起,两个库都需要使用相同版本的utils
进行编译。作为回报,图书馆的来源将保持良好和干净。
另一种方法是使用宏来更改utils
中的函数和变量名称以避免链接器错误。其中最重要的结果是代码重复:implone
和impltwo
都会链接不同名称下的相同代码段。另一个是可读性:它会受到巨大的影响,因为每个对utils
函数的引用都需要用宏包装。这使得第二种方法变得很脏,所以我肯定会推荐使utils
成为一个单独的库。
我在当前代码库中遇到类似的问题。我的解决方案与我在写这篇文章时得到的答案类似,但我将它作为比较/参考放在此处。
我有一个共同的静态库项目(我们称之为libCommonBits.a)。我有第二个静态库,里面有一些UI代码(我们称之为libCommonUI.a),这也取决于libCommonBits.a。我的主应用程序需要使用这两个库。
我的解决方案是不实际将libCommonBits.a链接到libCommonUI.a。它针对头文件进行编译,只是意味着我的主应用程序链接两个静态库而不是一个。
我希望这种方法是由更多的人分布图书馆采取。当您使用已经链接到公共库(JSONKit或类似库)的静态库时,您会感到沮丧,并且您也可以在代码库中单独使用它。在这种情况下,符号重命名可能是唯一的解决方案。
+1提醒人们不要链接到公共图书馆。 – 2012-07-10 15:58:28
使它成为三个库,共享implone和impltwo的util。 – dasblinkenlight 2012-07-10 03:14:53
@dasblinkenlight想到这一点,它会工作......是唯一的方法?也许是。 – 2012-07-10 03:16:05
这可能是最干净的选择。您可以使用宏来改变函数和变量的名称,但结果看起来不会很漂亮。 – dasblinkenlight 2012-07-10 03:20:54