前言

很多iOS工程都是基于Object-C开发,再逐步向Swift演进,演进过程中不可避免要进行Swift混编。Swift模块需要支持LLVM Module规范,混编工程会遇到各种Module编译错误。这对于不熟悉的同学来说简直是灾难,严重影响开发效率。本文介绍了大型工程Swift混编的工程问题和解决思appstore路,希望对大家有所帮助。

常见错误1:Could not build module xxx

当一个OC模块引用了Swift模块就产生了混编,混编的OC模块依赖链中的所有模块都必须满足LLVM Modappetiteule Standard。如果AModule依赖了BModule,BModule不符合Module规范,构建会报 “could not build module BModule”的错误。

Alibaba.com Swift混编踩坑实践——工程篇

解决方案1:通过一下设置“Framework Module允许导入非modular的头文件” 临时跳过问题

Approach1:模块的Podspec中设置

CLANG_ALLOW_NON_MODULAR_INCLUDES_INappstore_FRAMEWORK_MODULES = YES

Approach2: 在Podfile里设置

post_install do|installer|
installer.pods_project.build_confiappreciateguration_list.build_configurations.eachdo|configuration|
configur效率意识方面存在的问题ation.build_settings[‘CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES’]=’YES’
end
end

解决方案2:将BModule改造为符合LLVM Module标准(推荐)

常见错误2:No such module ‘XXXModule’

Alibaba.com Swift混编踩坑实践——工程篇

原因1:A模块的依赖树里不存在B模块

如果“Pod A” 需要impxcode是什么意思ort “BMo效率公式dule”,“AModule”的Podspec描述文件需要声明对于BModswift系统ule的依赖,否则就会报“No such module ‘XXXModule’”错误。Cocoapod会将依赖效率的英文关系转化成XCoSwiftde的FRA效率公式MEWORK_SEARCH_PATHS或LIBRARY_SEARCH_PATHS,因此只需要检测xcconfig是否存在对应的配置,xcode怎么运行程序就能判断Podspec描述是否缺失依赖。

stios是什么意思ep 1: 打开A模块的xcconf效率的拼音ig文件

Pods/Target Support Files/ios是苹果还是安卓AModule/AappstoreModule.xcconfig

Step 2: 查看xcconfig里的frameowork和librxcode教程ary配置,如果不存在是模块B,说明A模块的依赖树里没有B,需要效率公式再A模块的podspec文件中添加模块B的依赖。

LIBRARY_SEARCH_PATHS “PODswift代码S_CONFIGURATION_BUILD_DIR/B”FRAMEWORK_SEAios是什么意思RCH_PATHS=”{PODS_CONFIGURATios14.4.1更新了什么ION_BUILD效率公式_DIR}/B” FRAMEWORK_SEARCH_PATHS =”{PODS_ROOT}/B”

原因2:BModule的Framework缺少mios16odulemap文件

符合LLVM Module Standard的Framxcode修改项目名ework里都会有一个.moxcode是什么软件dulemap文件,如果缺少.modulemap文件说明Framework工程没有配置Define效率高发票查验 Moduios15le,同样ios越狱会报上述的错误。

Step1:检查Pods目录里BModule的Framework是否包含正确的.moduswift国际结算系统lemap文件

../Podsxcode下载/Masonry/Masonry.framework

Step2: 如果当前版本有问题而历史版本正常,可以swiftly查看CocoaPods的Caios系统che目录的各个版本,对比历史版本的Framework

../Library/Caches/CocoaPods/Pods/Release/Masonry/1.1.0-frameworkapplication-DG-1-cbeee/Masonry.framework

下面是Masonry Framework解包的目录,目录中包含一个module.modulemap文件

Alibaba.com Swift混编踩坑实践——工程篇

framework module Masonry {
umbrelapprovela header“MaiOSsonry.h”
export *
module * { export * }
}

原因3:umbrella header中引用头文件不符合规范

umbrella header 会暴露给外部引用的public header。LLVM Module规定所有public header都需要使用“<A/A.h> ”的方式应用头文件。iOS工程中通常有下面几种引用方式,只有第一种是符合LLVM Module 规范的。

#import <A/A.h> right
#import “A/A.h” wrong
#import “A.h” wrong
#import <A.h> wrong

例如下面Masonry的uios模拟器mbrella header就不符合规范

Alibaba.com Swift混编踩坑实践——工程篇

解决approach方案是将头文件import方式从“#import “A.h” ”改为“#import &lt效率符号;Masonry/xxx.h> ”

设置以下选项后,不标准的头文件引用会报错,方便检测和效率计算公式修复

Quoted Include In Framework Header Yess(Error)

Alibaba.com Swift混编踩坑实践——工程篇

原因4:swift compiler incompatible

No sucxcode教程h Module ‘XModule’
Failed to build module ‘AModule’; this SDK is not supported by the compiler (the SDK is built with ‘Apple Swift version 5.3.1 (swixcode怎么运行程序ftxcodeplaygroundlang-1200.0.41 clang-1200.0.32.8)’, while this compiler is ‘Apple Swift version 5.5 (swiftlang-1300.0.19.104 clang-1300.0.18.4)’). Please select a toolchain which matches the SDK.

本地调试时可能会遇到,比如AModule是静态库,AModule依赖了XModule, XModu效率高发票查验le是源码库。具体原因是AModule使用Xcode 12.4构建(Swift version 5.3.1),本地当前正在使用ios16了Xcode12.5(Swift versiXcodeon 5.3.1 )调试。解决ios15方案1是将本地使用的XCodeapplication版本先降到低于12.4.1 以下的版本。解决方案2是将AModule用新版本的Xios15Code重新构建发布新版本。

常见错误3approach:Include of non-modular header inside framework mod效率的拼音uxcode怎么运行程序le :

如果Framework Module ’AModule‘中加载了非AModule的头文件,比如AModios15ule.h iios是苹果还是安卓mport了一个OC头文件X.h,而X.h头文件又Include某个C/C++ 的头文件

AModule.h:9:9: error: include of non-modular header inside framework m效率公式odule ‘BModule.AModule’

解决方案:设置“Framework Module允许导入非moswift是什么dular的头文件”临时跳过问题

CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEswift系统WORK_MODULES = YES

效率公式见错误4:Definition of效率 ‘AMoudle’ must be imported from module ‘BMoudle.xxxheader’ before itxcode编译声卡 is required

如果AMoudle和XModule的公共头文件同时引用了BModule的某个公共头文件,就会appointment出现这个错误。

AMoudle_A.h 文件:
import <BModule/BModule_B.h>
XModule_X.m 文件:
import <BModule/BModule_B.h>

Alibaba.com Swift混编踩坑实践——工程篇

解决方案1:增加import <AModule/AMoudleXXX.h>

XModule_X.m 文件:
import <AModule/AMoudle_A.h>
import <BModule/BModule_B.h>

解决方案2:使用proxcode修改项目名ject引入模式调试pod

使用swift是什么意思啊Development pod进行源码调试pod会遇到上述错误,而如果使用project引入模式调试pod可以隔离各个Project效率意识方面存在的问题,就不会遇到这个错误。project引入模式类似swift package manager的appreciateedit模式。

自定义modulemap

Oios是什么意思C Framework通过Cocoapod自定义modulemap

AModule是OC模块,可以在Podspec进行如下配置自定义modulemap

spswift是什么意思啊ec.preserve_path = ‘Module效率高发票查验s/module.modulemap’
spec.module_map = ‘Modules/module.modulemap’
sxcode怎么运行程序pec.xcconfig = { ‘HEADER_SEARCH_PATHS’ => ‘(SDKROOT)/usr/include/libxml2(SDKROOT)/usr/include/libxml2 (PODS_ROOT)/AModappetiteule/Modules/module’ }
spec.pod_target_xcconfig = { ‘HEADER_SEARCH_PATHS’ => ‘$(PODS_ROOT)/AMoswift是什么dule/Modules/ios越狱module’ }

Swift framework不允许自定义modulemap

[!] Using Swift static libraries with custom module maps is curre效率是什么意思ntly not supported. Please bui效率的拼音ld `XXModule` as aappearance framework oxcode编译声卡r remove the custom module map.

总结

本文重点介绍了OC和Swift混编常见编译错误,如果你们的项目正从Object-C工程逐步向Swift演化,可以将本文作为参考。

参考

从预编译的角度理解xcode是什么软件Swift与Objectiv效率e-C及混编机制