1. 程式人生 > >OC和C++混編造成其它類錯誤的問題(Compile Sources As Objective-C++)

OC和C++混編造成其它類錯誤的問題(Compile Sources As Objective-C++)

最近整合百度SDK,實現路徑規劃,匯入這個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設定為""


2.如果您只在Xib檔案中使用了目標lib庫(比如BMKMapView),沒有在程式碼中使用它(BMKMapView),編譯器在連結時不會連結對應符合,需要在工程屬性中顯式設定:在XCode的Project -> Edit Active Target -> Build -> Linking -> Other Linker Flags

中新增:-ObjC

相關推薦

OCC++編造其它錯誤的問題(Compile Sources As Objective-C++)

最近整合百度SDK,實現路徑規劃,匯入這個SDK庫到新專案中,程式需要有以下設定才能不會報錯: 專案-Targets-Build Settings Apple LLVM 6.0 -Language-Compile Sources AS: C++ Language

oc swift編的時候打包ipa安裝不了

contains 方法 not 三方 ref gravity mark c項目 track 做了一個oc項目。裏面實用到swift第三方,真機執行的時候是正常的

iOS 快速從OC過渡到Swift,由理論到實戰-OCSwift

接上篇文章:iOS 快速從OC過渡到Swift,由理論到實戰-Swift基礎 OC和Swift混編 a. Swift 和 OC 的對映關係 Swift 相容來大部分 OC,當然還有一些 Swift 不能夠使用的,例如 OC 中的預處理指令,即巨集定義不可使用,雖

OCswift編包太大

關於object-c和swift混編問題,無論是在oc基礎上新增swift還是在swift上新增oc最後打出來的ipa的包都會大一到兩倍。因為這個原因可能有很多人會放棄混編,但是不用害怕,上傳iTun

oc swift

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 轉載請註明出處 如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支援我,謝謝! s

OC Swift OC 中呼叫 Swift

1、建立一個Object-C工程:SwiftInObjectC 2、建立一個Object-C的類:SwiftLan(注意選擇) 當建立完成後,Xcode提示下面警告,會提問我們需不需要創意一個Bridge,當然我們選擇“Yes”。 這樣會在工程中看到一個

iOS開發之OC Swift

前言 相信很多開發者在開發過程中,使用別人封裝好的三方框架,但由於三方框架的開發語言(OC或者Swift)與現有工程的開發語言不一致,導致無法直接使用,那麼對於混編來說,是不二的選擇。 Swift專案使用OC框架 1. 建立橋接檔案,一般的命名規則(專案名-Br

Objective C 學習心得 (一):--Windows下搭建objective C開發環境

      最近打算針對iPhone、iPod touch和iPad開發一些應用,所以,需要開始學習Objective C(蘋果推出的類似C語言的開發語言)。由於蘋果的自我封閉的產業鏈發展模式(從晶片、機器、開發語言、終端產品、服務)的限制,要想開發針對蘋果iPhone等產品

OC C++

先說題外話,文章標題其實起的不好,在iOS的開發中,Apple建立的庫基本都是用Objective-C寫的,所以在這裡的C++指的其實是Objective-C++。首先,最最最要緊的事情,不是程式碼而是編譯器選項,在做混合編譯之前一定要把編譯器的Compile Sources As選項改為Objective

occ/c++編的一些坑

情況一:匯入檔案類:(如.pch檔案) 1 , 檢查pch 是否匯入標頭檔案 , 匯入是否可用  ; 2,解決:在引用標頭檔案開始加入#ifdef __OBJC__ 結束時加入#endif,例如 #ifndef PureStandard_PrefixHeader_pch #define PureStand

Objective-C】05-OC物件中方法物件方法的比較

一、類方法 1.1 噹噹前方法中不涉及類的成員變數時,可以把方法宣告成類方法。這樣做的好處是可以不用宣告類的例項物件,減少記憶體空間的佔用,提高執行效率。即類的方法不依賴於物件。 1.2 以加號 + 開頭 1.3 只能由類(名)來呼叫 1.4 類方法中不能訪問類的成員變

C++構造函數對成員變量初始化,使用初始化列表構造函數內部直接賦值 的差別

初始化列表 不能 構造 調用 ron 二次 art size strong 初始化和賦值對內置類型的成員沒有什麽大的差別,像任一個構造函數都能夠。但有的時候必須用帶有初始化列表的構造函數: (1) 成員類型是沒有默認構造函數的類。若沒有提供顯式初始化時,則編譯器隱式

SwiftObjective-C混合編程——Swift調用OC

分享 發現 load 另一個 == 方法 代碼 swift 應用 在iOS應用的開發中。Swift必將代替OC,兩者的趨勢是“短期共存,長期代替”。但曾經有太多的代碼是用OC語言完畢的,而Swift的開發也從 OC中繼承了非常多的特性。兩者也是有非常多的類

C#.NET裏面抽象接口有什麽區別

end 吃飯 動物 虛方法 根據 自定義 private this sse 1.面向接口編程和面向對象編程是什麽關系 首先,面向接口編程和面向對象編程並不是平級的,它並不是比面向對象編程更先進的一種獨立的編程思想,而是附屬於面向對象思想體系,屬於其一部分。或者說,

Objective-C魔之路【8-訪問成員變量屬性】

order 線程安全 ring 內容 時間 targe 簡化 音樂 blank 郝萌主傾心貢獻,尊重作者的勞動成果。請勿轉載。 假設文章對您有所幫助,歡迎給作者捐贈,支持郝萌主,捐贈數額任意,重在心意^_^ 我要捐贈: 點擊捐贈 Cocos2d-X源代碼

奪命雷公狗C/C++-----1---語言數據常見32關鍵字

字符 log c/c++ 常見 分享 並且 所有 nio stat 重點提示: C語言中嚴格區分大小寫 數據類型如下所示: 32個關鍵字如下所示: auto--------這個這個關鍵字用於聲明變量的生存期為自動,即將不在任何類、結構、枚舉、聯合和函數中

OCC對照學習

data- 我們 類型 高速 annotate column col track tle OC和C對照學習 1、已有C的基礎,怎樣高速入門OC? 1)源文件對照 思考&實現1: 1)在C語言中,我們遇到不同後綴的文件有哪

的頭文件裏盡量少引入其它頭文件 <<Effective Objective-C>>

scrip 過程 length int 無法使用 c 語言 dem 在一起 word 與C 和C++ 一樣,Objective-C 也使用“頭文件”(header file) 與“實現文件”(implementation file)來區隔代碼。用Obje

Objective-C方法 load initialize

object mage cnblogs 什麽 類方法 color ech 引用 https 1、區別:+load 是只要類所在文件被引用就會被調用,而 +initialize 是在類或者其子類的第一個方法被調用前調用。所以如果類沒有被引用進項目,就不會有 +load 調用;