如何跨静态库共享代码而不出现重复符号错误?

如何跨静态库共享代码而不出现重复符号错误?

问题描述:

我是新来建立静态库,并希望创建2(+)库,其中每个库都有一些独特的代码和一些共享的代码。我的意图是其他项目将链接一个或多个这些静态库。如何跨静态库共享代码而不出现重复符号错误?

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

我使用的XCode并且通过在一种情况下建立和Util.m生成ImplOne.m的库,并且在其他Util.mImplTwo.m

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

+0

使它成为三个库,共享implone和impltwo的util。 – dasblinkenlight 2012-07-10 03:14:53

+0

@dasblinkenlight想到这一点,它会工作......是唯一的方法?也许是。 – 2012-07-10 03:16:05

+0

这可能是最干净的选择。您可以使用宏来改变函数和变量的名称,但结果看起来不会很漂亮。 – dasblinkenlight 2012-07-10 03:20:54

我认为最简洁的选择是为共享的Utils.h/m制作一个单独的库。缺点是您的用户需要链接utils以及implone和/或impltwo,并且为了将impooneimpltwo链接在一起,两个库都需要使用相同版本的utils进行编译。作为回报,图书馆的来源将保持良好和干净。

另一种方法是使用宏来更改utils中的函数和变量名称以避免链接器错误。其中最重要的结果是代码重复:imploneimpltwo都会链接不同名称下的相同代码段。另一个是可读性:它会受到巨大的影响,因为每个对utils函数的引用都需要用宏包装。这使得第二种方法变得很脏,所以我肯定会推荐使utils成为一个单独的库。

我在当前代码库中遇到类似的问题。我的解决方案与我在写这篇文章时得到的答案类似,但我将它作为比较/参考放在此处。

我有一个共同的静态库项目(我们称之为libCommonBits.a)。我有第二个静态库,里面有一些UI代码(我们称之为libCommonUI.a),这也取决于libCommonBits.a。我的主应用程序需要使用这两个库。

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

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

+0

+1提醒人们不要链接到公共图书馆。 – 2012-07-10 15:58:28