iOS使用OC、Swift、C++、Framework混编的坑

遇坑过程

最近在POC一个项目,项目是OC与Swift混编开发的,其中存在.mm文件对C++库的函数调用。原项目编译本身是没问题的,但我引入一个Swift写的framework,经过一系列引用和调用,编译报错,经过几天的不断尝试,才真正解决问题,总结出以下注意点。

OC、Swift循环引用

OC调用Swift,只需#import "$(SWIFT_MODULE_NAME)-Swift.h"
Swift调用OC,只需在"xxx-Bridging-Header.h"文件中引用OC头文件;

当某OC类(举例:OCObject)既要调用Swift,同时也需要被Swift调用时,需要在"xxx-Bridging-Header.h"#import "OCObject.h",在OCObject.m#import "$(SWIFT_MODULE_NAME)-Swift.h"

但不能在OCObject.h#import "$(SWIFT_MODULE_NAME)-Swift.h",因为会造成循环引用,报错:Cycle inside CSStockPOC_Example; building could produce unreliable results.(可能存在第一次Build Succeeded,后面才Build Failed

.mm文件引用Swift Framework报错

.mm文件是为了OC与C++混编,或调用C++函数,如果在.mm文件中通过@import xxxx引用Swift Framework时,会报错Use of '@import' when C++ modules are disabled, consider using -fmodules and -fcxx-modules
解决方式:
TARGETS - Build Phases找到该.mm文件,双击添加-fcxx-modules

但重新编译后,还会报错Could not build module 'xxxx'
解决方式:
TARGETS - Build Settings搜索CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES改为YES

xxx-Swift.h文件报错

在.mm文件中#import "$(SWIFT_MODULE_NAME)-Swift.h",导致xxx-Swift.h内部报错,解决方式其实和上面的一样。

你可能感兴趣的:(iOS使用OC、Swift、C++、Framework混编的坑)