混编中遇到的搞笑事件

http://hi.baidu.com/%BD%C7%C2%E4%C0%EF%B5%C4%C3%A8/blog/item/181ff08bfe05780ec8fc7a25.html

今天DouDou遇到了一个让他抓狂的问题,由于一些抽出来的方法不需要依赖任何属性,为了节约开销,他把这些函数都写成C函数,然后在Objective-C里调用,结果总是报 symbol(s) not found for architecture i386这个error,找了半天也没找出哪里错了。google这次也没能帮阿拉解决问题。

话说最后小幻自己写了个测试工程发现做法是没有问题的,问题就在于DouDou建了两个头文件,然后以为改了一个的后缀变成.m就可以了,结果发现原来Xcod不是那么好骗的。so,要么建.m文件,把里面的实现删掉写自己东东,要么直接建成.c文件,然后把后缀改成.m,源文件就是源文件,头文件不可以冒充滴~

Xcode,史上最智能编译器,DouDou如是说。

        再来说说混编这点事儿,如果文件太多,一个个改后缀总是麻烦,有人说可以生成静态库,小幻还没用过那么大量的模块移植,所以没做过,就记录下,如果以后遇到了,也知道往哪个方向去做。

网友jimney的个人总结(原文来自Cocoachina论坛,转帖请注明

1、仅Objective-C与C混编
     1) .m开头包含c头文件
      2)直接使用

2、仅Objective-C与C++混编
       1)修改要包含的.m文件类型为.mm
        2)  .mm中包含c++头文件
        3)创建c++类对象,并初始化,调用其成员函数

3、Objective-C    C 、C++混编
         1)同时修改.c .cpp以及要包含的.m三个文件类型都为.mm
          2)使用时,直接调用,c++则先创建对象并初始化,然后调用其成员函数

关于第三种,使用范例如下:

CPrint.h 

扫描二维码关注公众号,回复: 1368304 查看本文章
 
void printHellow();
 
CPrint.mm(已修改)

 
#include "CPrint.h"
 
void printHellow(){printf("C  hello!\n");
}
 
CPPPrint.h

 
class CPPPrint
{
public:
    CPPPrint();
    ~CPPPrint();
    void printHellow();
 
};
 
CPPPrint.mm(已修改)
 
#include "CPPPrint.h"
 
CPPPrint::CPPPrint(){}
 
CPPPrint::~CPPPrint(){}
 
void 
CPPPrint::printHellow(){printf("CPP  hello!\n");
 
}
 
***ViewController.mm
 
-(void)viewDidLoad {[super viewDidLoad];
 
    //call in c style
    printHellow();
 
    //call in cpp style
    CPPPrint cppPrint;
    cppPrint.printHellow();
}
 
工程例子下载: MixProgramTest.zip

猜你喜欢

转载自o0o0o0o.iteye.com/blog/1481529