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

最近要幫忙做一個SDK,主體功能已經實現,是用C/C++編寫的,所以導入這個SDK庫到新項目中,程序需要有以下設置才能不會報錯:

項目-Targets-Build Settings AppleLLVM 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容