无法使用命令行编译简单的C++ Metal程序

3

我正在尝试在一台新的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文件!

1个回答

0
在您发布的命令中,您包含了-I./metal-cpp,这是您需要的其中一项(假设在编译时metal-cpp在您的当前工作目录中),但您还需要-F./metal-cpp,这样Clang++才知道在哪里找到额外的框架。您不需要-L./metal-cpp,因为metal-cpp是仅包含头文件的。

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