在iOS开发过程中,Objective-C的代码有时需要调用C/C++代码,本篇文章介绍Objective-C如何混合编译C/C++。

Xcode新建一个工程,选择macOS选项下面的Command Line Tool,工程命名为OCCppProject。

Objective-C 调用C

在工程中新建文件test.c文件,同时生成test.h文件,写入代码

test.h

#ifndef test_h
#define test_h#include <stdio.h>#endif /* test_h */void testC();

test.m

#include "test.h"void testC()
{printf("testC in called\n");
}

新建TestOC文件,语言选择Objective-C,写入代码

TestOC.h

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface TestOC : NSObject- (void)ocCallC;@endNS_ASSUME_NONNULL_END

TestOC.m

#import "TestOC.h"
#include "test.h"@implementation TestOC- (void)ocCallC
{testC();
}@end

main.m

#import <Foundation/Foundation.h>#import "TestOC.h"int main(int argc, const char * argv[]) {@autoreleasepool {TestOC *testOC = [[TestOC alloc] init];[testOC ocCallC];}return 0;
}

main.m中文件引入TestOC.h文件,并且使用TestOC的实例调用ocCallC方法,这个方法调用了C的函数testC()

代码可以正常编译和运行,所以Objective-C的代码可以直接调用C的函数,直接引入C的头文件,不需要额外改动。

C调用Objective-C

C语言的文件调用Objective-C,需要修改C文件的后缀为.m,修改test.C变为test.m

test.h

#ifndef test_h
#define test_h#include <stdio.h>#endif /* test_h */void testC();

test.m

#include "test.h"
#import "TestOC.h"void testC()
{TestOC *testOC = [[TestOC alloc] init];[testOC ocMethod];
}

TestOC.h

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface TestOC : NSObject- (void)ocCallC;
- (void)ocMethod;@endNS_ASSUME_NONNULL_END

TestOC.m

#import "TestOC.h"
#include "test.h"@implementation TestOC- (void)ocCallC
{testC();
}- (void)ocMethod
{NSLog(@"ocMethod is called");
}@end

main.m

#import <Foundation/Foundation.h>#import "TestOC.h"
#include "test.h"int main(int argc, const char * argv[]) {@autoreleasepool {testC();}return 0;
}

代码可以正常编译和运行,C调用Objective-C,需要修改C语言文件的后缀为.m,引入OC的头文件后就可以正常使用了。

Objective-C调用C++

新建TestCpp.h和TestCpp.m文件,并且声明CPPObject类

TestCpp.h

#ifndef TestCpp_h
#define TestCpp_h#include <stdio.h>
#include <iostream>#endif /* TestCpp_hpp */class CPPObject {public:void testCpp();
};

TestCpp.m

#include "TestCpp.h"void CPPObject::testCpp(){std::cout << "cpp function is called" <<std::endl;
}

main.m

#import <Foundation/Foundation.h>#import "TestOC.h"int main(int argc, const char * argv[]) {@autoreleasepool {TestOC *testOC = [[TestOC alloc] init];[testOC ocCallCpp];}return 0;
}

Objective-C调用C++文件,需要修改文件后缀为.mm,然后引入头文件使用。

C++调用Objective-C

新建桥接文件CppOCInterface.h和CppOCInterface.mm

CppOCInterface.h

#ifndef CppOCInterface_h
#define CppOCInterface_h#include <stdio.h>#endif /* CppOCInterface_h */void testBridge();

CppOCInterface.mm

#include "CppOCInterface.h"
#import "TestOC.h"void testBridge()
{TestOC *testOC = [[TestOC alloc] init];[testOC ocMethod];
}

Test.h

#ifndef TestCpp_h
#define TestCpp_h#include <stdio.h>#endif /* TestCpp_hpp */class CPPObject {public:void cppCallOC();
};

Test.cpp

#include "TestCpp.h"
#include "CppOCInterface.h"void CPPObject::cppCallOC()
{testBridge();
}

main.mm文件

#import <Foundation/Foundation.h>#import "TestOC.h"
#include "TestCpp.h"int main(int argc, const char * argv[]) {@autoreleasepool {CPPObject obj = CPPObject();obj.cppCallOC();}return 0;
}

C++调用OC会比较麻烦,需要新建CppOCInterface文件作为桥接文件,桥接文件由于是.mm后缀的,所以桥接文件可以访问OC。

C++调用桥接文件,桥接文件调用Objective-C,总体的流程是这样。

Objective-C和C/C++混合编译相关推荐

  1. ios:在XCode下混合编译C++/Objective-C

    先说题外话,文章标题其实起的不好,在iOS的开发中,Apple建立的库基本都是用Objective-C写的,所以在这里的C++指的其实是Objective-C++. 首先,最最最要紧的事情,不是代码而 ...

  2. XCode下Object C和C++混合编译

    最近,在iOS上调试一个App,核心代码是用C++实现的,App界面使用Object C实现,在XCode下混合编译 C++/Object-C遇到的问题总结一下: 1. 文件格式问题,C++里的.h和 ...

  3. 如何混合编译C语言和C++

    如何混合编译C语言和C++ 实际开发过程中,C++中会调用C与语言编写的代码,我在网络上面找到一篇写得很好的文章 http://blog.csdn.net/keensword/article/deta ...

  4. 华为鸿蒙OS发布!余承东:随时可替换安卓;方舟编译器将支持混合编译

    乾明 边策 郭一璞 发自 凹非寺  量子位 报道 | 公众号 QbitAI 千呼万唤始出来,华为鸿蒙操作系统,今日正式发布. 英文名HarmonyOS,寓意为和谐. 并不像亿万行代码的安卓那样笨重,鸿 ...

  5. makefile多目录的.c 格式.cpp混合编译

    原文地址:http://blog.csdn.net/yangbingzhou/article/details/50218315 [cpp] view plaincopyprint? # # c.cpp ...

  6. Linux下c和cuda混合编译,并生成动态链接库.so和使用

    Linux下c和cuda混合编译,并生成动态链接库.so和使用 2016-08-27 14:27 98人阅读 评论(0) 收藏 举报 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得 ...

  7. Android N混合编译与对热补丁影响深度解析

    大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动.冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也 ...

  8. VS2005混合编译ARM汇编代码

    2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令 ...

  9. .Net Core Razor 预编译,动态编译,混合编译

    预编译 预编译是ASP .Net Core的默认方式.在发布时,默认会将系统中的所有Razor视图进行预编译.编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xx ...

  10. gem5和nvmain混合编译

    由于做混合内存,需要使用nvmain来做NVM的模拟,使用gem5做全系统的仿真,两者结合使用. 1.安装gem5 gem5的安装,包括相关依赖环境的安装见我的另外一篇博客:gem5的安装.编译及运行 ...

最新文章

  1. java 类定义_JAVA类与对象(二)----类定义基础
  2. apache workprefork
  3. HDU 2149.Public Sale-巴什博奕
  4. Macbook air 键盘标点符号怎么输出?
  5. 如何通过牛顿方法解决Logistic回归问题 By 机器之心2017年8月09日 16:30 本文介绍了牛顿方法(Newton's Method),以及如何用它来解决 logistic 回归。log
  6. MFC界面编程新思路--模仿MATLAB式的界面
  7. 小兔伴伴家庭动物园AR智能早教产品上市
  8. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器
  9. SDH光端机的应用介绍
  10. python构造自定义数据包_pytorch中的自定义数据处理详解
  11. mysql-libs 5.6.23_利用rpm包手把手教你安装MySQL5.6.23
  12. Exar签署最终协议 5900万美元收购Hifn
  13. LU分解的矩阵逆运算
  14. sharepoint 在Visual Studio设置其他页面的加载标签
  15. MyCat - 使用篇(5)
  16. 超级快的端口扫描工具blackwater
  17. 100行python代码实现细胞自动机(康威生命游戏)
  18. IIC详解之AT24C08
  19. 视频编解码发展历程(从AVC到HEVC再到VVC)(二)
  20. 开机动画desc.txt描述文件的分析

热门文章

  1. 【实践】多条曲线在一幅图上,Origin如何对每一条曲线单独设置
  2. 深度分析:云控系统有什么功能,工作室用的话咋样?
  3. 建木(Jianmu)----迈出建木第一步创建项目分组
  4. 统信桌面操作系统V20专业版(1020)正式发布
  5. 怎么确定光纤分光器的分光比?
  6. Latex学习笔记 (Ex4)希腊字母、罗马字母一览表
  7. Excel 对象模型
  8. VirtualLab基础实验教程-7.偏振(2)
  9. 任务的同步与通信_读书笔记_6
  10. 聪明好学的王强用计算机设计了,五年级语文下册期中试卷-(1)(1).doc