遇坑过程
最近在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
内部报错,解决方式其实和上面的一样。
网友评论