.h :頭文件。頭文件包含類谍珊,類型治宣,函數(shù)和常數(shù)的聲明。
.m :源代碼文件砌滞。這是典型的源代碼文件擴(kuò)展名侮邀,可以包含Objective-C和C代碼。
.mm :源代碼文件贝润。帶有這種擴(kuò)展名的源代碼文件绊茧,除了可以包含Objective-C和C代碼以外還可以包含C++代碼。僅在你的Objective-C代碼中確實(shí)需要使用C++類或者特性的時(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:
C++ Language Dialect 和 C++ Standard Library
這么做后晰甚,.a靜態(tài)庫(kù)文件都能編譯通過(guò)衙传,但是問(wèn)題來(lái)了,如果項(xiàng)目中引用到了其它的第三方庫(kù)文件厕九,可能會(huì)產(chǎn)生錯(cuò)誤蓖捶,如下圖所示:
就是很莫名其妙的就出現(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ì)遇到類似的問(wèn)題:
那么到底該如何解決呢皮获?如果切換回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ù)靠瞎、以及之后可能添加的不同類型源碼文件都沒(méi)有問(wèn)題,我們以文件類型來(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ò)誤,那么就修改其它的文件】
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