如何使用 CMake 构建 Apple 的 Metal-cpp 示例?

me *_* me 7 c++ cmake metal

最近,Apple 发布了一个直接使用 C++ 使用 Metal 的库。我在网上找到的示例(https://github.com/moritzhof/metal-cpp-examples)如果我复制源代码并按照Apple概述的步骤进行操作(https://developer.apple.com) ,则可以使用该示例/metal/cpp/)在 Xcode 中。我不使用附带的 Xcode 项目文件,以避免任何“隐藏”设置。

现在我尝试使用 CMake 构建相同的示例,其中包含以下 CMakeLists.txt:

cmake_minimum_required(VERSION 3.8)
project(HelloWorld)

set(CMAKE_CXX_STANDARD 17)

include_directories(${PROJECT_SOURCE_DIR}/metal-cpp)

set(SOURCE_FILES metal-cpp-test/main.cpp metal-cpp-test/metal_adder.cpp)
add_executable(program ${SOURCE_FILES})

# specify which libraries to connect
# target_link_libraries(program ${METAL})
# target_link_libraries(program ${FOUNDATION})
# target_link_libraries(program ${QUARTZCORE})

find_library(METAL Metal)
find_library(FOUNDATION Foundation)
find_library(QUARTZCORE QuartzCore)

target_link_libraries(program stdc++ "-framework Metal" "-framework Foundation" "-framework QuartzCore" objc)
Run Code Online (Sandbox Code Playgroud)

它编译成功,但是行

auto lib = _device->newDefaultLibrary();
Run Code Online (Sandbox Code Playgroud)

现在似乎返回一个 null-ptr。知道这可能是什么原因以及如何解决这个问题吗?

0xB*_*1A8 5

构建应用程序的 Xcode 项目中的所有.metal文件都被编译并构建到单个默认库中。

_device->newDefaultLibrary()返回一个新的库对象,其中包含默认库中的函数。如果找不到默认库,此方法将返回 nil 。

由于您没有使用 Xcode,因此您应该手动编译Metal Shading Language 源代码并构建 Metal 库。

然后,在运行时,调用该newLibrary(filePath, &error)方法来检索并访问作为对象的库MTL::Library

NS::String* filePath = NS::String::string("The full file path to a .metallib file", NS::UTF8StringEncoding);
NS::Error* error;
auto library =_device->newLibrary(filePath, &error);
if(error)
{
                    
}
Run Code Online (Sandbox Code Playgroud)

  • 啊谢谢,确实是这个问题。我现在使用 newLibrary(const NS::String* source, const MTL::CompileOptions* options, NS::Error** error) 从字符串构建,它似乎正在工作。不过,命名有点令人困惑,因为我最初认为默认库是某种系统库。 (2认同)