iOS开发-OC、C、C++ 混编

OC里面的有三大类文件.m/.h(OC),.c/.h (C),.cpp/.hpp(C++)。

一、在OC中调用C或者C++

如果是.m文件,可以用OC和C的代码;

如果是.mm文件,可以用OC和C和C++的代码;

.m 和.mm 的区别是告诉编译器在编译时要加的一些参数。.mm也可以命名成.m,手动加编译参数。

二、在C++中调用OC

PIMPL (Private Implementation, 私有实现)

不要在C++中依赖ARC,最好自己手动管理。

遇到的问题:

1,尝试在同一个文件中调用oc、c、c++,ld: symbol(s) not found for architecture x86_64。

问题出现的原因和OC无关,在c++中引用c的头文件,需要用extern "C"{}把代码包括起来。详细原因见下:

http://stackoverflow.com/questions/9334650/linker-error-calling-c-function-from-objective-c

2,在c++中调用OC时遇到了问题,在.cpp文件中调用OC的类,在Foundation处报错。

问题出现在.cpp文件用的是纯粹的c++编译。

解决方案:把实现放在.mm。 

    learnCplus(1, 2); //在OC中使用c
    
    learnCplusplus(1, 2); //在OC中用C++编译的C
    
    //在OC中使用C++的类
    object = new cppObject();
    NSString* str = @"GAO高级
";
    std::string cpp_str([str UTF8String], [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
    object->exampleMethod(cpp_str);
    delete object;
    object = NULL; //记得删除
    
    
    //在OC使用的C++类中 使用OC
    LY::OCinCPP* cpp = new LY::OCinCPP();
    cpp->lyRun();

 实现的代码放在了 GIT https://github.com/loyinglin/LearnCandC-InObjective-C.git 

参考

http://blog.csdn.net/horkychen/article/details/7935910

http://www.mamicode.com/info-detail-416411.html

原文地址:https://www.cnblogs.com/loying/p/5208821.html