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高级\n"; 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
参考