轉自:
http://hi.baidu.com/onejw/item/f34390c997cdc226a1b50ae
http://www.cocoachina.com/ask/questions/show/57217
http://www.cnblogs.com/uyoug321/archive/2010/12/11/1903499.html
Xcode中支持C、C++、Object-C3種語言的混編
Xcode中支持C、C++、Object-C3種語言的混編,那么如果想讓編譯器混編,只需要將實現類的".m"格式修改成".mm"即可,這樣編譯器即可編譯允許c、c++、oc的代碼;
但是混編代碼,在編譯最容易出現也是最多的錯誤如下:
- Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2 failed with exit
部分分析總結如下:
1. (全局變量)static方法名重復-因為C語言里沒有對象的概念,它的方法只要加入相應的.h文件就可以使用,所以,如果和C++ or Objective-C的靜態方法重名了,那么環境無法區分,很明顯,這個錯誤是編譯時候的錯誤,而對於static的變量及方法是在編譯的時候便被加入的,所以無法識別.
2. (命名空間)全局變量名重復,理由和上面是一樣的,當然,如果是全局變量,建議在Objective-C的.m文件(當然現在被改成.mm了)中聲名,不然,聲明在.h中單獨使用是沒有問題的,如果直接引用了C or C++的.h,那么即使這時候全局變量不重復,也會出現上面的問題.
3. (主函數)含有多個main方法,main方法是程序的入口,如果有多個文件含有main方法,那么也會出現上面的問題.
其實對於“failed with exit”的問題,總的來說,這個問題就是因為方法或是全局變量重復所導致的編譯環境無法識別並編譯 !所以童鞋們使用混編程序的時候要特別注意,最好的解決辦法就是,如果你的項目后期有1/100000 的幾率會使用混編進行(例如加入box2d開發包),那么就應該從項目一開始就將實現類修改成".mm"格式進行編譯代碼,防止后期復雜的各種混編問題;
注意以下兩點:
Automatic Reference 模式要關掉
Compile Source As ---> Objective C++
轉自:http://www.cocoachina.com/ask/questions/show/57217
你可以寫一個oc的類,頭文件都用oc的方法聲明,在原文件里面直接調用c++的就行。不過原文件后綴名要改為.mm
舉個例子:
@interface MyOC :
NSObject
-(void)ImportRootCertificate;
@end
@implementation MyOC
-(void)ImportRootCertificate{
A *a = new A();
a-> ImportRootCertificate(prame,....);//你的c++調用。
}
@end
//使用
MyOc *oc = [Myoc alloc] init];
[oc ImportRootCertificate];//這樣就間接調用你的c++了。
轉自:http://www.cnblogs.com/uyoug321/archive/2010/12/11/1903499.html
Object-C其實是種在C或者C++代碼中嵌入運行級對象調用的語言!
什么是運行級對象調用,就是對象調用不是在語法級的,而是在編譯后的運行級的,類似的技術還有微軟的COM和開放對象組織的Corba,只不過后兩個並不把運行級對象調用的內容加到實現語言里,而是使用單獨的IDL語法和文件!
理解了上面這個東西,就能明白,就是讓編譯器是把源文件當成C還是當成C++來編譯!
方法一:直接改擴展名
.m文件就是把源文件當成寫有Object-C的C文件來編譯
.mm文件就是把源文件當成寫有Object-C的C++文件來編譯
方法二:通過Xcode改文件屬性
選擇文件,打開Menu的Filey->Get Info
更改File Type的下拉選擇,我相信程序員一眼就能看出里面是什么意思 :)
推薦大家個朋友開的淘寶小店店, 歡迎光臨
https://shop545764523.taobao.com/