0

在将自定义 Core Image 过滤器内核迁移到 Metal Shading Language 时,我在构建默认 Metal 库 (default.metallib) 时遇到错误:

metallib: error: exactly one input file required

我的印象是这些可能在单独的 .metal 文件中。尝试将它们合并到一个文件中会导致此错误:

Metal library creation failed: Error Domain=MTLLibraryErrorDomain Code=3 "Filters module must contain no vertex/fragment/kernel functions but contains 1 kernel function"

命名空间以metal防止coreimage计算内核在默认库中显示为可用函数。

找到了这个 SO answer,它建议构建单独的库:

Metal:为 MSL cikernel 设置编译器和链接器选项后,.metal 文件中定义的 vertexFunction 变为 nil

4

2 回答 2

0

您现在不能使用默认的 Metal 构建管道将.metal包含 Core Image 内核的多个文件编译到一个库中。设置标志时,链接器不允许将多个.air文件合并为一个。.metallib-cikernel

您要么必须将所有内核放入一个.metal文件中,要么使用我在上面链接到的答案中发布的解决方案。

于 2019-11-07T08:28:04.283 回答
0

您可以创建多个Foo.metalBar.metal文件。只是不要将它们添加为链接器目标。

而是在一个文件中#include "Foo.metal"。并且仅将文件添加为链接器目标。#include "Bar.metal"Main.metalMain.metal

这样只有一个.metal文件,其中包括所有其他.metal文件。简单的。


因此Main.metal文件的内容可能看起来很简单:

#include "Foo.metal"
#include "Bar.metal"
于 2020-01-07T16:54:06.637 回答