Objective-C和C/C++混合编译
在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++混合编译相关推荐
- ios:在XCode下混合编译C++/Objective-C
先说题外话,文章标题其实起的不好,在iOS的开发中,Apple建立的库基本都是用Objective-C写的,所以在这里的C++指的其实是Objective-C++. 首先,最最最要紧的事情,不是代码而 ...
- XCode下Object C和C++混合编译
最近,在iOS上调试一个App,核心代码是用C++实现的,App界面使用Object C实现,在XCode下混合编译 C++/Object-C遇到的问题总结一下: 1. 文件格式问题,C++里的.h和 ...
- 如何混合编译C语言和C++
如何混合编译C语言和C++ 实际开发过程中,C++中会调用C与语言编写的代码,我在网络上面找到一篇写得很好的文章 http://blog.csdn.net/keensword/article/deta ...
- 华为鸿蒙OS发布!余承东:随时可替换安卓;方舟编译器将支持混合编译
乾明 边策 郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 千呼万唤始出来,华为鸿蒙操作系统,今日正式发布. 英文名HarmonyOS,寓意为和谐. 并不像亿万行代码的安卓那样笨重,鸿 ...
- makefile多目录的.c 格式.cpp混合编译
原文地址:http://blog.csdn.net/yangbingzhou/article/details/50218315 [cpp] view plaincopyprint? # # c.cpp ...
- Linux下c和cuda混合编译,并生成动态链接库.so和使用
Linux下c和cuda混合编译,并生成动态链接库.so和使用 2016-08-27 14:27 98人阅读 评论(0) 收藏 举报 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得 ...
- Android N混合编译与对热补丁影响深度解析
大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动.冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也 ...
- VS2005混合编译ARM汇编代码
2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令 ...
- .Net Core Razor 预编译,动态编译,混合编译
预编译 预编译是ASP .Net Core的默认方式.在发布时,默认会将系统中的所有Razor视图进行预编译.编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xx ...
- gem5和nvmain混合编译
由于做混合内存,需要使用nvmain来做NVM的模拟,使用gem5做全系统的仿真,两者结合使用. 1.安装gem5 gem5的安装,包括相关依赖环境的安装见我的另外一篇博客:gem5的安装.编译及运行 ...
最新文章
- java 类定义_JAVA类与对象(二)----类定义基础
- apache workprefork
- HDU 2149.Public Sale-巴什博奕
- Macbook air 键盘标点符号怎么输出?
- 如何通过牛顿方法解决Logistic回归问题 By 机器之心2017年8月09日 16:30 本文介绍了牛顿方法(Newton's Method),以及如何用它来解决 logistic 回归。log
- MFC界面编程新思路--模仿MATLAB式的界面
- 小兔伴伴家庭动物园AR智能早教产品上市
- 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器
- SDH光端机的应用介绍
- python构造自定义数据包_pytorch中的自定义数据处理详解
- mysql-libs 5.6.23_利用rpm包手把手教你安装MySQL5.6.23
- Exar签署最终协议 5900万美元收购Hifn
- LU分解的矩阵逆运算
- sharepoint 在Visual Studio设置其他页面的加载标签
- MyCat - 使用篇(5)
- 超级快的端口扫描工具blackwater
- 100行python代码实现细胞自动机(康威生命游戏)
- IIC详解之AT24C08
- 视频编解码发展历程(从AVC到HEVC再到VVC)(二)
- 开机动画desc.txt描述文件的分析
热门文章
- 【实践】多条曲线在一幅图上,Origin如何对每一条曲线单独设置
- 深度分析:云控系统有什么功能,工作室用的话咋样?
- 建木(Jianmu)----迈出建木第一步创建项目分组
- 统信桌面操作系统V20专业版(1020)正式发布
- 怎么确定光纤分光器的分光比?
- Latex学习笔记 (Ex4)希腊字母、罗马字母一览表
- Excel 对象模型
- VirtualLab基础实验教程-7.偏振(2)
- 任务的同步与通信_读书笔记_6
- 聪明好学的王强用计算机设计了,五年级语文下册期中试卷-(1)(1).doc