最近在搞SDK,有需求要將SDK拆成多個(gè).a庫著淆,而其中多個(gè)庫中都用到了一些公用類劫狠,如果將這些庫放在同一個(gè)工程中,編譯就會(huì)出現(xiàn)duplicate symbol問題永部,這也是一個(gè)很頭疼的問題独泞。
經(jīng)過Google,找到了一個(gè)很神奇的方法苔埋,通過預(yù)定義宏的方式將沖突的文件重命名懦砂,這個(gè)編譯的時(shí)候就不會(huì)報(bào)錯(cuò)了。
原理如下:
就是將類名通過宏定義的方式將其重命名组橄,編譯的時(shí)候使用重名后的名字進(jìn)行編譯荞膘。
比如類ClassA
,將其重名為ClassB
晨炕,可以通過宏
#define ClassA ClassB
這樣編譯的時(shí)候是使用ClassA
來編譯的衫画,而不是使用之前的ClassB
了。
以下是操作方法:
1.可以在Build Settings-> Apple LLVM 7.1 - Custom Complier Flags-> Other C Flags
中瓮栗,添加類似以下選項(xiàng):
Other C Flags
-Dname=rename
表示將name
重名為rename
削罩。-D
為gcc
的編譯選項(xiàng)瞄勾,對(duì)于-Dname=definition
,其表示為預(yù)定義名為name
弥激,值為definition
的宏进陡。其實(shí)就相當(dāng)于在代碼中定義宏
#define name definition
2.也可以在Build Phases -> Compile Sources
中對(duì)某個(gè)文件的Complier Flags
進(jìn)行設(shè)置,如下,將HTMLParser
重命名為SDHTMLParser
Compiler flags
經(jīng)過設(shè)置之后微服,多個(gè)庫公用了同一類文件的庫趾疚,放在一個(gè)工程里面就不會(huì)沖突了。不過有一些麻煩以蕴,需要對(duì)公用的文件都重命名一下才行糙麦。