我正在尝试开始在装有 OS Monterey 的新 Macbook Pro 上使用 Metal 制作游戏。我不想使用 xcode,可能会使用 make 文件,但首先我只想用它编译最简单的应用程序来测试它是否有效。
我按照官方文档中列出的步骤下载了 metal-cpp 项目并将其解压缩到我的项目根目录中。我的文件夹看起来像这样:
root
main.cpp
metal-cpp
... all the metal files here
我的主文件很简单
#define NS_PRIVATE_IMPLEMENTATION
#define CA_PRIVATE_IMPLEMENTATION
#define MTL_PRIVATE_IMPLEMENTATION
#include <Foundation/Foundation.hpp>
#include <Metal/Metal.hpp>
#include <QuartzCore/QuartzCore.hpp>
int main() {
}
现在,当我尝试使用这样的命令编译它时
clang++ -std=c++20 -stdlib=libc++ -g ./main.cpp -o ./main -I/usr/local/include -L/usr/local/lib
或
clang++ -std=c++20 -stdlib=libc++ -g ./main.cpp -o ./main -I/usr/local/include -L/usr/local/lib -framework Metal -framework Foundation -framework QuartzCore
我得到这样的错误
fatal error: 'Foundation/Foundation.hpp' file not found
note: did not find header 'Foundation.hpp' in framework 'Foundation' (loaded from '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks')
我也试过包括像这样的直接路径
#include "metal-cpp/Foundation/Foundation.hpp"
#include "metal-cpp/Metal/Metal.hpp"
#include "metal-cpp/QuartzCore/QuartzCore.hpp"
虽然它找到了标题,但它后来在一些试图引用框架的深埋金属文件中失败了
<Foundation/Foundation.hpp>
我知道这些“框架”(不知道这是什么意思,对不起,我是 C++ 的新手,编译的东西超出了 hello world)在像
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks
这样的目标位置不存在,所以我也试过
clang++ -std=c++20 -stdlib=libc++ -g ./main.cpp -o ./main -I/usr/local/include -I./metal-cpp -L/usr/local/lib -L./metal-cpp -framework Metal -framework Foundation -framework QuartzCore
但我仍然得到同样的错误。我已经下载了 Xcode 并在另一篇文章(here)中看到您可以将 Xcode SDK 包复制到一些框架目录,这将在编译时使其可见,但我不知道在哪里可以找到它们或者是否真的应该复制它们到
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks
.
我在这上面花了好几个小时,似乎人们完成这个的唯一两种方法是使用 Xcode 或 Cmake。我确定这两个都很好,但我是初学者,我想在学习的同时坚持简单的命令行编译,并且不希望 Xcode 构建的不透明和自动操作混淆了真正发生的事情,而且我喜欢在 VSCode 中开发,我不做跨平台构建或任何花哨的东西,所以我不想使用 Cmake。
所以基本上我想弄清楚的是我在编译代码时如何包含这些 Metal 文件!