如何将C++动态库正确集成到iOS应用(含嵌入式框架方案)
将C++动态库集成到iOS应用的正确方法
iOS不支持直接使用普通.dylib文件,必须将C代码打包成iOS动态Framework(Dynamic Framework),再配合Objective-C包装层实现OC与C++的交互,以下是完整落地步骤:
一、用CMake生成iOS动态Framework
创建CMakeLists.txt,配置iOS交叉编译规则与Framework输出属性:
cmake_minimum_required(VERSION 3.18) project(CalculatorFramework) # 配置iOS编译环境 set(CMAKE_SYSTEM_NAME iOS) set(CMAKE_OSX_SYSROOT iphoneos) # 指定支持的CPU架构,按需调整 set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO) set(CMAKE_CXX_STANDARD 11) # 以动态库形式编译C++代码 add_library(CalculatorFramework SHARED Calculator.cpp Calculator.hpp ) # 配置Framework核心属性 set_target_properties(CalculatorFramework PROPERTIES FRAMEWORK TRUE FRAMEWORK_VERSION A MACOSX_FRAMEWORK_IDENTIFIER com.yourcompany.CalculatorFramework MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist PUBLIC_HEADER Calculator.hpp )
配套创建Info.plist(可从Xcode新建Framework项目中复制模板,修改Bundle ID等信息),然后执行编译:
mkdir build && cd build cmake .. -G Xcode # 编译模拟器版本 xcodebuild -project CalculatorFramework.xcodeproj -scheme CalculatorFramework -sdk iphonesimulator -configuration Release # 编译真机版本 xcodebuild -project CalculatorFramework.xcodeproj -scheme CalculatorFramework -sdk iphoneos -configuration Release # 合并真机/模拟器架构(可选,方便跨环境调试) lipo -create build/Release-iphoneos/CalculatorFramework.framework/CalculatorFramework build/Release-iphonesimulator/CalculatorFramework.framework/CalculatorFramework -output CalculatorFramework cp CalculatorFramework build/Release-iphoneos/CalculatorFramework.framework/
二、编写Objective-C++包装层
OC无法直接调用C++类,需写一层包装器暴露OC接口:
CalculatorWrapper.h(纯OC头文件,供iOS项目直接调用)
#import <Foundation/Foundation.h> @interface CalculatorWrapper : NSObject - (float)addA:(float)a andB:(float)b; - (float)subtractA:(float)a fromB:(float)b; - (float)multiplyA:(float)a andB:(float)b; - (float)divideA:(float)a byB:(float)b; @end
CalculatorWrapper.mm(Objective-C实现,链接C库)
#import "CalculatorWrapper.h" #include "Calculator.hpp" @implementation CalculatorWrapper { Calculator *_calculator; } - (instancetype)init { self = [super init]; if (self) { _calculator = new Calculator(); } return self; } - (void)dealloc { delete _calculator; [super dealloc]; } - (float)addA:(float)a andB:(float)b { return _calculator->add(a, b); } - (float)subtractA:(float)a fromB:(float)b { return _calculator->subtract(b, a); } - (float)multiplyA:(float)a andB:(float)b { return _calculator->multiply(a, b); } - (float)divideA:(float)a byB:(float)b { return _calculator->divide(a, b); } @end
若要简化集成,可将这两个文件加入CMake的源文件列表,让Framework直接包含OC接口。
三、集成Framework到iOS项目
- 将生成的
CalculatorFramework.framework拖入Xcode项目,勾选「Copy items if needed」 - 在项目General标签页的「Frameworks, Libraries, and Embedded Content」中,将
CalculatorFramework.framework的Embed设置为Embed & Sign(必须签名,否则运行时会报错) - 在需要调用的OC文件中引入头文件:
#import <CalculatorFramework/CalculatorWrapper.h>
四、调用示例
CalculatorWrapper *calculator = [[CalculatorWrapper alloc] init]; float addResult = [calculator addA:3.2 andB:5.8]; NSLog(@"加法结果:%f", addResult);
关键注意事项
- iOS仅允许签名的动态Framework嵌入应用,
Embed & Sign是必选配置 - 发布正式版本时,可移除模拟器架构,减小包体积
- 若无需动态更新库,也可选择静态Framework,但需调整CMake的
SHARED为STATIC
内容的提问来源于stack exchange,提问作者iOS
相关产品推荐
相关产品推荐

