最近要幫忙做一個(gè)SDK,主體功能已經(jīng)實(shí)現(xiàn)恰聘,是用C/C++編寫的句各,所以導(dǎo)入這個(gè)SDK庫到新項(xiàng)目中,程序需要有以下設(shè)置才能不會(huì)報(bào)錯(cuò):
項(xiàng)目-Targets-Build Settings Apple LLVM 6.0 -Language-Compile Sources AS:
C++ Language Dialect 和 C++ Standard Library
將編譯方式設(shè)置成ObjectIve-C++晴叨,sdk的移植不會(huì)報(bào)錯(cuò)凿宾,但是如果項(xiàng)目中引用到了某些第三方的庫,就是很莫名其妙的就出現(xiàn)了問題兼蕊,經(jīng)過調(diào)試發(fā)現(xiàn)初厚,原來是Compile Sources As 設(shè)置為 Object-C++所導(dǎo)致的,也就是說編譯器開始識(shí)別C++了孙技,而ObjectiveC部分參數(shù)識(shí)別不了产禾,所以就各種錯(cuò)誤了常見的是AsynSocket通訊類庫。
那么怎么才能既兼容c++的庫牵啦,又兼容oc的庫了亚情?
1,Compile Sources As 切換回According to File Type哈雏,這樣能保證其它的第三方庫楞件、以及之后可能添加的不同類型源碼文件都沒有問題,我們以文件類型來動(dòng)態(tài)編譯(也就是說是oc文件裳瘪,就用oc編譯土浸,是C++文件,就以C++編譯)
2彭羹,在新項(xiàng)目中黄伊,把AppDelegate或是引用到lib庫的那個(gè)文件或是任意一個(gè)文件后綴修改成.mm,這樣派殷,系統(tǒng)編譯時(shí)就可以識(shí)別到C++了毅舆,我們自己的lib庫也不會(huì)出錯(cuò)了~
終結(jié):
1.靜態(tài)庫中如果有采用ObjectC++實(shí)現(xiàn)西篓,那么需要您保證您工程中至少有一個(gè).mm后綴的源文件(您可以將任意一 個(gè).m后綴的文件改名為.mm),或者在工程屬性中指定編譯方式憋活,即將XCode的Project -> Edit Active Target -> Build Setting-> GCC4.2 - Language -> Compile Sources As設(shè)置為"Objective-C++"
2.如果您只在Xib文件中使用了目標(biāo)lib庫(比如BMKMapView)岂津,沒有在代碼中使用它(BMKMapView),編譯器在鏈接時(shí)不會(huì)鏈接對(duì)應(yīng)符合悦即,需要在工程屬性中顯式設(shè)定:在XCode的Project -> Edit Active Target -> Build -> Linking -> Other Linker Flags中添加:-Ob