如何消除Xcode中Swift包的「目标mylib源文件应位于指定路径」警告?
解决Swift Package中C目标的路径警告问题
我有一个包含名为mylib的C目标的Swift包,在Xcode中收到警告:Source files for target mylib should be located under /path/to/SomeSwiftPackage/Sources/mylib,但实际我的源文件确实就在该路径下。
我的Package.swift文件内容如下:
// swift-tools-version:5.5 import PackageDescription let package = Package( name: "SomeSwiftPackage", products: [ .library( name: "SomeSwiftPackage", targets: ["SomeSwiftPackage"]), ], dependencies: [], targets: [ .target( name: "mylib", dependencies: [] ), .target( name: "SomeSwiftPackage", dependencies: [ .target(name: "mylib"), ] ) ] )
文件夹结构如下:
SomeSwiftPackage/ Package.swift Sources/ SomeSwiftPackage/ SomeSwiftPackage.swift mylib/ include/ mylib.h mylib.c helper.h helper.c
mylib里只有include目录下的mylib.h不在/path/to/SomeSwiftPackage/Sources/mylib根目录下,这是必要的头文件。
解决方法
问题源于Swift Package Manager(SPM)的默认文件扫描规则:对于C/C++目标,它默认认为所有源文件(包括头文件)都直接放在目标对应的Sources子目录下,嵌套子目录会被误判为不属于该目标,从而触发警告。可以通过以下两种方式解决:
方案一:指定公共头文件路径
在mylib目标的配置中添加publicHeadersPath,明确告诉SPM公共头文件所在的子目录:
.target( name: "mylib", dependencies: [], publicHeadersPath: "include" )
这个方案最简洁,适合有单独include目录存放公共头文件的场景。
方案二:显式声明所有源文件
如果方案一无效,可以手动列出mylib的所有源文件和头文件,让SPM明确识别这些文件属于该目标:
.target( name: "mylib", dependencies: [], sources: [ "mylib.c", "helper.c", "include/mylib.h", "helper.h" ] )
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

