最近要幫忙做一個(gè)SDK潘拱,主體功能已經(jīng)實(shí)現(xiàn),是用C/C++編寫的拧略,所以導(dǎo)入這個(gè)SDK庫(kù)到新項(xiàng)目中芦岂,程序需要有以下設(shè)置才能不會(huì)報(bào)錯(cuò):
項(xiàng)目-Targets-Build Settings AppleLLVM 6.0 -Language-Compile Sources AS:
C++ Language Dialect 和 C++ Standard Library
這么做后,.a靜態(tài)庫(kù)文件都能編譯通過(guò)垫蛆,但是問(wèn)題來(lái)了禽最,如果項(xiàng)目中引用到了其它的第三方庫(kù)文件,可能會(huì)產(chǎn)生錯(cuò)誤袱饭,如下圖所示:
就是很莫名其妙的就出現(xiàn)了問(wèn)題川无,經(jīng)過(guò)調(diào)試發(fā)現(xiàn),原來(lái)是Compile Sources As 設(shè)置為 Object-C++所導(dǎo)致的虑乖,也就是說(shuō)編譯器開始識(shí)別C++了懦趋,而ObjectiveC部分參數(shù)識(shí)別不了,所以就各種錯(cuò)誤了决左。
相信有的朋友在使用百度地圖api的時(shí)候愕够,添加lib庫(kù)也會(huì)遇到類似的問(wèn)題:
那么到底該如何解決呢走贪?如果切換回According To File Type,那么lib庫(kù)(SDK庫(kù))就會(huì)報(bào)錯(cuò)惑芭,切換成C++坠狡,部分第三方庫(kù)就會(huì)出差,該怎樣混編兼容呢遂跟?接下來(lái)我給出一種方案逃沿,具體如下:
1,Compile Sources As切換回According to File Type幻锁,這樣能保證其它的第三方庫(kù)凯亮、以及之后可能添加的不同類型源碼文件都沒(méi)有問(wèn)題,我們以文件類型來(lái)動(dòng)態(tài)編譯(也就是說(shuō)是oc文件哄尔,就用oc編譯假消,是C++文件,就以C++編譯)
2岭接,在新項(xiàng)目中富拗,把AppDelegate或是引用到lib庫(kù)的那個(gè)文件或是任意一個(gè)文件后綴修改成.mm,這樣鸣戴,系統(tǒng)編譯時(shí)就可以識(shí)別到C++了啃沪,我們自己的lib庫(kù)也不會(huì)出錯(cuò)了~
【PS:如果AppDelegate中有其它調(diào)用,修改成.mm后綴會(huì)引起錯(cuò)誤窄锅,那么就修改其它的文件】
3创千,此時(shí)在運(yùn)行項(xiàng)目,是不是都沒(méi)問(wèn)題了入偷?第三方庫(kù)也不會(huì)報(bào)錯(cuò)了(跟Compile Sources As有關(guān))追驴,我們自己的lib庫(kù)、SDK也不會(huì)報(bào)錯(cuò)了~
注意事項(xiàng)
1.靜態(tài)庫(kù)中如果有采用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++"(第二種方法容易與第三方庫(kù)沖突)
2.如果您只在Xib文件中使用了目標(biāo)lib庫(kù)(比如BMKMapView)体捏,沒(méi)有在代碼中使用它(BMKMapView)冠摄,編譯器在鏈接時(shí)不會(huì)鏈接對(duì)應(yīng)符合,需要在工程屬性中顯式設(shè)定:在XCode的Project -> Edit Active Target -> Build -> Linking ->Other Linker Flags中添加:-ObjC