我正在尝试在一台新的Macbook Pro上使用Metal开始制作游戏,该电脑运行OS Monterey。我不想使用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并在另一篇帖子中看到(这里)可以将Xcode SDK包复制到某些框架目录中,这样编译时就会变得可见,但我不知道在哪里找到它们或者它们是否真的应该被复制到/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks
。
我已经花了好几个小时,似乎人们实现这一点的唯一两种方法是使用Xcode或Cmake。我相信这两种方法都很好,但我是一个初学者,想坚持使用简单的命令行编译,同时我还不想让Xcode构建的不透明和自动化操作混淆真正发生的事情,而且我喜欢在VSCode中开发,并且我没有进行跨平台构建或任何花哨的东西,所以我不想使用Cmake。
因此,基本上我要弄清楚的是,在编译我的代码时如何包含这些Metal文件!