Swift Package Manager 如何为单个文件添加 -fno-objc-arc 编译标记
解决方案
可以实现单文件关闭ARC的需求,目前Swift Package Manager未原生支持单文件粒度的编译参数配置,最稳定的兼容方案是拆分出独立子target承载需要特殊编译参数的文件:
配置步骤
- 将需要使用
-fno-objc-arc标记的sourcefile_noARC.mm单独作为一个子target的唯一源码文件,仅给该子target配置特殊编译标记 - 原有主target移除该文件,依赖新的子target即可
修改后的Package.swift示例
// swift-tools-version:5.4 import PackageDescription let package = Package( name: "library_name", platforms: [ .iOS(.v13) ], products: [ .library( name: "library_name", targets: ["library_name"]), ], targets: [ // 新增子target:仅包含需要关闭ARC的单个文件 .target( name: "library_name_noarc", path: "./sources/", sources: [ "sourcefile_noARC.mm" ], publicHeadersPath: "SwiftPackage/headers/", cxxSettings: [ .headerSearchPath("./"), .unsafeFlags(["-fno-objc-arc"]) ] ), // 原有主target .target( name: "library_name", dependencies: ["library_name_noarc"], // 依赖新增的子target path: "./sources/", sources: [ // 移除sourcefile_noARC.mm "sourcefile2.mm", "sourcefile3.cpp", ], publicHeadersPath: "SwiftPackage/headers/", cxxSettings: [ .headerSearchPath("./") ] ), ], cxxLanguageStandard: .cxx14 )
说明
该方案下-fno-objc-arc标记仅会应用到sourcefile_noARC.mm这一个文件,其余所有文件仍保持默认ARC编译,完全匹配需求。如果子target的代码需要引用主target的头文件,按需调整子target的头文件搜索路径配置即可。
内容的提问来源于stack exchange,提问作者Richard Topchii
相关产品推荐
相关产品推荐

