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

e1xvtsh3  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(192)

我试图开始在一个新的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。
因此,基本上我试图弄清楚的是,我如何包括这些金属文件时,编译我的代码!

tvmytwxo

tvmytwxo1#

在你发布的一个命令中,你包含了-I./metal-cpp,这是你需要的东西之一(假设编译时metal-cpp在你当前的工作目录中),但是你还需要-F./metal-cpp,这样Clang++就知道在哪里可以找到额外的框架。你不应该需要-L./metal-cpp,因为metal-cpp是header only。

相关问题