我试图开始在一个新的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。
因此,基本上我试图弄清楚的是,我如何包括这些金属文件时,编译我的代码!
1条答案
按热度按时间tvmytwxo1#
在你发布的一个命令中,你包含了
-I./metal-cpp
,这是你需要的东西之一(假设编译时metal-cpp
在你当前的工作目录中),但是你还需要-F./metal-cpp
,这样Clang++就知道在哪里可以找到额外的框架。你不应该需要-L./metal-cpp
,因为metal-cpp是header only。