Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在没有重复符号错误的情况下跨静态库共享代码?_Objective C_Xcode_Architecture_Linker - Fatal编程技术网

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

Objective c 如何在没有重复符号错误的情况下跨静态库共享代码?,objective-c,xcode,architecture,linker,Objective C,Xcode,Architecture,Linker,我不熟悉构建静态库,希望创建2个(+)库,每个库都有一些唯一的代码和一些共享代码。我的意图是其他项目将链接一个或多个静态库 Util.h/m <-- Shared ImplOne.h/m <-- Unique to 'ImplOne' ImplTwo.h/m <-- Unique to 'ImplTwo' Util.h/m我认为最干净的选择是为共享的Utils.h/m创建一个单独的库。缺点是,用户需要将utils与implone和/或implttwo链接在一起,为了将i

我不熟悉构建静态库,希望创建2个(+)库,每个库都有一些唯一的代码和一些共享代码。我的意图是其他项目将链接一个或多个静态库

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

Util.h/m我认为最干净的选择是为共享的
Utils.h/m
创建一个单独的库。缺点是,用户需要将
utils
implone
和/或
implttwo
链接在一起,为了将
implone
implttwo
链接在一起,两个库都需要使用相同版本的
utils
进行编译。作为回报,库的源代码将保持整洁


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

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

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

Util.h/m  <-- Shared
ImplOne.h/m  <-- Unique to 'ImplOne'
ImplTwo.h/m  <-- Unique to 'ImplTwo'
我的解决方案是不将libCommonBits.a实际链接到libCommonUI.a。它可以根据头文件进行编译,这意味着我的主应用程序链接到两个静态库,而不是一个


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

将其设为三个库,与implone和impltwo共享util。@dasblinkenlight想到了这一点,它就可以工作了。。。这是唯一的办法吗?也许是的。这可能是最干净的选择。你可以用宏来改变函数和变量的名称,但是结果看起来不太好,这很公平。我实在想不出它怎么会更干净。想把你的评论写进答案里吗?然后我就可以结束了。