最近要幫忙做一個SDK,主體功能已經實現,是用C/C++編寫的,所以導入這個SDK庫到新項目中,程序需要有以下設置才能不會報錯:
項目-Targets-Build Settings Apple LLVM 6.0 -Language-Compile Sources AS:
C++ Language Dialect 和 C++ Standard Library
這麼做後,.a靜態庫文件都能編譯通過,但是問題來了,如果項目中引用到了其它的第三方庫文件,可能會產生錯誤,如下圖所示:
就是很莫名其妙的就出現了問題,經過調試發現,原來是Compile Sources As 設置爲 Object-C++所導致的,也就是說編譯器開始識別C++了,而ObjectiveC部分參數識別不了,所以就各種錯誤了。
相信有的朋友在使用百度地圖api的時候,添加lib庫也會遇到類似的問題:
那麼到底該如何解決呢?如果切換回According To File Type,那麼lib庫(SDK庫)就會報錯,切換成C++,部分第三方庫就會出差,該怎樣混編兼容呢?接下來我給出一種方案,具體如下:
1,Compile Sources As 切換回According to File Type,這樣能保證其它的第三方庫、以及之後可能添加的不同類型源碼文件都沒有問題,我們以文件類型來動態編譯(也就是說是oc文件,就用oc編譯,是C++文件,就以C++編譯)
2,在新項目中,把AppDelegate或是引用到lib庫的那個文件或是任意一個文件後綴修改成.mm,這樣,系統編譯時就可以識別到C++了,我們自己的lib庫也不會出錯了~
【PS:如果AppDelegate中有其它調用,修改成.mm後綴會引起錯誤,那麼就修改其它的文件】
3,此時在運行項目,是不是都沒問題了?第三方庫也不會報錯了(跟Compile Sources As有關),我們自己的lib庫、SDK也不會報錯了~
注意事項
1.靜態庫中如果有采用ObjectC++實現,那麼需要您保證您工程中至少有一個.mm後綴的源文件(您可以將任意一 個.m後綴的文件改名爲.mm),或者在工程屬性中指定編譯方式,即將XCode的Project -> Edit Active Target -> Build Setting-> GCC4.2 - Language -> Compile
Sources As設置爲"Objective-C++"
2.如果您只在Xib文件中使用了目標lib庫(比如BMKMapView),沒有在代碼中使用它(BMKMapView),編譯器在鏈接時不會鏈接對應符合,需要在工程屬性中顯式設定:在XCode的Project -> Edit Active Target -> Build -> Linking ->
Other Linker Flags中添加:-ObjC