Swift Package Manager无法找到头文件问题求助
问题描述
项目结构
. ├── Package.swift ├── Sources │ └── Argon │ ├── include │ │ └── Argon.h │ └── some_source.c └── deps └── olive.c └── olive.c # Header file
Package.swift 代码
// swift-tools-version: 5.7 import PackageDescription let package = Package( name: "MyPackage", targets: [ .target( name: "Argon", cSettings: [ .headerSearchPath("deps/olive.c"), ] ) ] )
Argon.h 中的引入语句
#include <olive.c>
编译报错信息
In file included from /Users/jonaseveraert/Documents/projects/photobooth/Sources/Argon/some_source.c:3:
/Users/jonaseveraert/Documents/projects/photobooth/Sources/Argon/src/../include/argon.h:41:10: fatal error: 'olive.c' file not found
#include <olive.c>
^~~~~~~~~
1 error generated.
已尝试但无效的操作:
- 使用
.unsafeFlags(["-Idep/olive.c"]) - 将
olive.c重命名为olive.h
需要解决:headerSearchPath未生效的原因,以及如何正确找到这个以.c为扩展名的头文件。
解决方案
核心问题
Swift Package Manager中,.headerSearchPath的路径是相对于目标源码目录(Sources/Argon/),而非项目根目录。你之前写的deps/olive.c会被解析为Sources/Argon/deps/olive.c,显然不存在这个路径。
方法一:修正相对路径
直接调整headerSearchPath的路径,从Sources/Argon/回到项目根目录,再指向依赖目录:
// swift-tools-version: 5.7 import PackageDescription let package = Package( name: "MyPackage", targets: [ .target( name: "Argon", cSettings: [ .headerSearchPath("../../deps/olive.c"), ] ) ] )
方法二:声明为头文件依赖目标(更规范)
将olive.c目录声明为独立的头文件目标,让SPM自动处理路径:
// swift-tools-version: 5.7 import PackageDescription let package = Package( name: "MyPackage", targets: [ .target( name: "Olive", path: "deps/olive.c", publicHeadersPath: ".", type: .headerOnly ), .target( name: "Argon", dependencies: ["Olive"] ) ] )
这种方式不需要手动设置搜索路径,保留#include <olive.c>即可正常编译,且更符合SPM的依赖管理规范。
内容的提问来源于stack exchange,提问作者Jomy
相关产品推荐
相关产品推荐

