将C静态库打包为二进制xcframework并通过SwiftPM分发的头文件问题
解决SwiftPM中预构建xcframework头文件路径问题的方案
你不需要修改原代码的#include语句,有几种可行的方法让SwiftPM识别你的头文件路径:
方法1:调整xcframework的头文件目录结构(推荐)
打包xcframework时,把原代码中基于公共根路径的头文件目录(比如cool/)完整放到xcframework的Headers目录下。这样Headers就成为头文件搜索的根路径,原#include "cool/cpp.h"语句就能直接找到对应文件。
如果用CMake打包,修改install命令,将头文件安装到Headers下的对应子目录:
# 假设原头文件在项目根目录的include/cool下 install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/cool DESTINATION Headers FILES_MATCHING PATTERN "*.h")
重新打包xcframework后,Headers目录下会有cool子文件夹,SwiftPM默认会将Headers加入头文件搜索路径,原#include语句无需修改即可正常工作。
方法2:在Package.swift中添加头文件搜索路径
如果无法调整xcframework的打包流程,可以在Swift Package的Package.swift中,为依赖该xcframework的target添加HEADER_SEARCH_PATHS配置,指向xcframework的Headers目录:
let package = Package( name: "YourWrapperPackage", products: [ .library(name: "YourWrapper", targets: ["YourWrapper"]), ], dependencies: [ .binaryTarget( name: "COOLKit", path: "./COOLKit.xcframework" ), ], targets: [ .target( name: "YourWrapper", dependencies: ["COOLKit"], buildSettings: [ // 通用写法,覆盖所有平台的xcframework头文件路径 "HEADER_SEARCH_PATHS": "$(inherited) ${SWIFT_PACKAGE}/COOLKit.xcframework/**/Headers" ] ), ] )
这个配置会让编译器将xcframework的Headers目录加入搜索路径,原#include "cool/cpp.h"就能被正确解析。
方法3:修改modulemap文件添加搜索路径
调整xcframework中Modules/module.modulemap文件,添加头文件搜索路径指向Headers目录:
framework module COOLKit { // 添加相对于modulemap的搜索路径(modulemap在Modules目录,Headers在上一级) search path "../Headers" // 如果有 umbrella header 保留这行,否则直接列出需要的头文件 umbrella header "COOLKit.h" export * module * { export * } }
如果没有umbrella header,也可以直接指定需要的头文件:
framework module COOLKit { search path "../Headers" header "cool/cpp.h" // 其他需要暴露的头文件... export * }
修改后重新打包xcframework,SwiftPM解析modulemap时会自动从指定路径查找头文件。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

