最近在搞SDK,有需求要将SDK拆成多个.a库,而其中多个库中都用到了一些公用类,如果将这些库放在同一个工程中,编译就会出现duplicate symbol问题,这也是一个很头疼的问题。
经过Google,找到了一个很神奇的方法,通过预定义宏的方式将冲突的文件重命名,这个编译的时候就不会报错了。
原理如下:
就是将类名通过宏定义的方式将其重命名,编译的时候使用重名后的名字进行编译。
比如类ClassA
,将其重名为ClassB
,可以通过宏
#define ClassA ClassB
这样编译的时候是使用ClassA
来编译的,而不是使用之前的ClassB
了。
以下是操作方法:
1.可以在Build Settings-> Apple LLVM 7.1 - Custom Complier Flags-> Other C Flags
中,添加类似以下选项:
-Dname=rename
表示将name
重名为rename
。-D
为gcc
的编译选项,对于-Dname=definition
,其表示为预定义名为name
,值为definition
的宏。其实就相当于在代码中定义宏
#define name definition
2.也可以在Build Phases -> Compile Sources
中对某个文件的Complier Flags
进行设置,如下,将HTMLParser
重命名为SDHTMLParser
经过设置之后,多个库公用了同一类文件的库,放在一个工程里面就不会冲突了。不过有一些麻烦,需要对公用的文件都重命名一下才行。
网友评论