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

7
最近,苹果发布了一个库,可以使用C++直接使用Metal。我在网上找到的示例(https://github.com/moritzhof/metal-cpp-examples), 如果我复制源代码并按照苹果(https://developer.apple.com/metal/cpp/)在Xcode中概述的步骤操作,它可以正常工作。为避免任何“隐藏”的设置,我没有使用包含的Xcode项目文件。
现在,我正在尝试使用这个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)

它成功编译,但是这一行

auto lib = _device->newDefaultLibrary();

现在似乎返回了空指针。有什么原因和如何解决?

你的GPU设备对象是否已初始化? - Hamid Yusifli
我相信可以获取名称,例如。但是正如我所说,如果将其配置为Xcode项目,则完全相同的代码可以工作,因此我认为问题可能出在设置中。 - me me
1个回答

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)
{
                    
}

2
啊,谢谢,那确实是问题所在。我现在正在使用newLibrary(const NS::String* source, const MTL::CompileOptions* options, NS::Error** error)从字符串构建,看起来它正在工作。命名有点令人困惑,因为我最初认为默认库是某种系统库。 - me me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接