现在的位置: 首页 > 综合 > 正文

Xcode中C、C++、Object-C3种语言的混编

2013年08月25日 ⁄ 综合 ⁄ 共 1818字 ⁄ 字号 评论关闭

转自:

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的代码;

     但是混编代码,在编译最容易出现也是最多的错误如下:

view plain

  1. 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的下拉选择,我相信程序员一眼就能看出里面是什么意思 :)

抱歉!评论已关闭.