iOS SDK開(kāi)發(fā)時(shí),有關(guān)OC和C++混編造成其它類(lèi)錯(cuò)誤的問(wèn)題(Compile Sources As Objective-C++)

.h :頭文件。頭文件包含類(lèi),類(lèi)型,函數(shù)和常數(shù)的聲明。
.m :源代碼文件。這是典型的源代碼文件擴(kuò)展名,可以包含Objective-C和C代碼。
.mm :源代碼文件。帶有這種擴(kuò)展名的源代碼文件,除了可以包含Objective-C和C代碼以外還可以包含C++代碼。僅在你的Objective-C代碼中確實(shí)需要使用C++類(lèi)或者特性的時(shí)候才用這種擴(kuò)展名

當(dāng)你需要在源代碼中包含頭文件的時(shí)候,你可以使用標(biāo)準(zhǔn)的#include編譯選項(xiàng),但是Objective-C提供了更好的方法。#import選項(xiàng)和#include選項(xiàng)完全相同,只是它可以確保相同的文件只會(huì)被包含一次。Objective-C的例子和文檔都傾向于使用#import。

最近要幫忙做一個(gè)SDK,主體功能已經(jīng)實(shí)現(xiàn),是用C/C++編寫(xiě)的,所以導(dǎo)入這個(gè)SDK庫(kù)到新項(xiàng)目中,程序需要有以下設(shè)置才能不會(huì)報(bào)錯(cuò):

項(xiàng)目-Targets-Build Settings Apple

LLVM 6.0 -Language

-Compile Sources AS

image

C++ Language Dialect 和 C++ Standard Library

image

這么做后,.a靜態(tài)庫(kù)文件都能編譯通過(guò),但是問(wèn)題來(lái)了,如果項(xiàng)目中引用到了其它的第三方庫(kù)文件,可能會(huì)產(chǎn)生錯(cuò)誤,如下圖所示:

image
image

就是很莫名其妙的就出現(xiàn)了問(wèn)題,經(jīng)過(guò)調(diào)試發(fā)現(xiàn),原來(lái)是Compile Sources As 設(shè)置為 Object-C++所導(dǎo)致的,也就是說(shuō)編譯器開(kāi)始識(shí)別C++了,而ObjectiveC部分參數(shù)識(shí)別不了,所以就各種錯(cuò)誤了。

相信有的朋友在使用百度地圖api的時(shí)候,添加lib庫(kù)也會(huì)遇到類(lèi)似的問(wèn)題:

image

那么到底該如何解決呢?如果切換回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ù)、以及之后可能添加的不同類(lèi)型源碼文件都沒(méi)有問(wèn)題,我們以文件類(lèi)型來(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ò)誤,那么就修改其它的文件】

image

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++"

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容