iOS SDK開發時,有關OC和C++混編造成其它類錯誤的問題(Compile Sources As Objective-C++)


最近要幫忙做一個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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章