Apple 文档: Building a Library with Metal’s Command-Line Tools Metal Shading Language for Core Image Kernels
1. 在 Build Rules 结合 xcrun 编译生成Core Image 用的 kernel 文件
*.metal: .metal 格式文件 *.ci.metal: 是自定义的文件后缀格式.
1.工程引入两个文件:ColorLUT_1.ci.metal 和 ColorLUT_1.ci.metal, 文件内容一样,编译报错: /Users/victor/Documents/MyDoc/MetalStudy/Code/MetalLib试验/air-lld:1:1: 3 duplicated symbols for target 'air64-apple-macosx12.1.0' air-lld command failed with exit code 1 (use -v to see invocation)
原因: 两个metal文件默认被编译到 default.metallib, 符号重复定义了。 2. 添加编译规则后报错: cannot load '/Users/victor/Documents/MyDoc/MetalStudy/Code/MetalLib试验/ColorLUT_1.ci.metal': The file was not recognized as a valid object file cannot load '/Users/victor/Documents/MyDoc/MetalStudy/Code/MetalLib试验/ColorLUT_2.metal': The file was not recognized as a valid object file
网上多数方法和Apple文档 Metal Shading Language for Core Image Kernels 是说在 Building Settings | Metal Compiler 中设置-fcikernel, 但是最新xcode 创建的项目中没有 Metal Compiler 生成选项。
注:当然也可以更改工程文件格式:见文档: Xcode 版本升级后找不到网上提到的相关配置了
解决参考Apple 课程Build Metal-based Core Image kernels with Xcode中的方法: 介绍如何在Build Rules编写脚本,而不是修改Build Settings. 具体来说,只需为 .ci.metal 和 .ci.air 编写脚本即可。 .ci.metal 是:
xcrun metal -c $MTL_HEADER_SEARCH_PATHS -fcikernel "${INPUT_FILE_PATH}" -o "${SCRIPT_OUTPUT_FILE_0}"
并配置输出文件: $(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).air
.ci.air 是:
xcrun metallib -cikernel "${INPUT_FILE_PATH}" -o "${SCRIPT_OUTPUT_FILE_0}"
并配置输出文件: $(METAL_LIBRARY_OUTPUT_DIR)/$(INPUT_FILE_BASE).metallib
看起来像这样:
补充:
- 添加编译规则后还是错误: cannot load ‘/Users/victor/Documents/MyDoc/MetalStudy/Code/MetalLib试验/ColorLUT_1.ci.metal’: The file was not recognized as a valid object file
不知道为什么,我删除Demo新建后,成功了,可能之前的Demo有别的设置问题。 - 编译规则中常见变量输出:
echo "INPUT_FILE_NAME=$INPUT_FILE_NAME"
echo "DERIVED_FILES_DIR=$DERIVED_FILES_DIR"
echo "INPUT_FILE_BASE=$INPUT_FILE_BASE"
echo "INPUT_FILE_DIR=$INPUT_FILE_DIR"
echo "INPUT_FILE_PATH=$INPUT_FILE_PATH"
echo "SOURCE_ROOT=$SOURCE_ROOT"
echo "SCRIPT_OUTPUT_FILE_0=$SCRIPT_OUTPUT_FILE_0"
echo "MTL_HEADER_SEARCH_PATHS=$MTL_HEADER_SEARCH_PATHS"
|