首页 > 解决方案 > 在 Windows 上针对 WebAssembly(--target=wasm64) 的 Clang 找不到 C++ 标头

问题描述

我在 Windows 7 上安装了 clang 11.0.0。我使用 clang++ 编译了一个简单的 helloworld.cpp,没有问题:

clang++ helloworld.cpp -c

现在我的目标是针对 WebAssembly,所以我跑了:

clang++ helloworld.cpp --target=wasm32 -c

这给了我错误“找不到 iostream 文件”。我用详细来查看包含路径有:

忽略不存在的目录“ /include/wasm64-wasi/c++/v1
忽略不存在的目录“ /include/c++/v1
忽略不存在的目录“/include/wasm64-wasi”
忽略不存在的目录“/include”
#include“... " 搜索从这里开始:
#include <...> 搜索从这里开始:
C:\LLVM\lib\clang\11.0.0\include
搜索列表结束。

似乎 clang 正试图在这些 linux 样式下查找可以找到 C++ 标头的路径,但是我使用的是 Windows。

如前所述,它在不针对 wasm 的情况下工作,这意味着 clang 知道在 Windows 风格的 VC++ 包含路径下查看。有没有办法查看 VC++ 包含指定 --target=wasm64 的路径?顺便说一句,我确实安装了 MinGW 并在 PATH 环境变量中。

使用Emscripten,我能够使其工作,因为 Emscripten 在其自己的安装中具有 C++ 标头。但是仍然很好奇是否可以仅使用clang。

标签: c++windowsclangclang++webassembly

解决方案


要像这样编译 hello world,您还需要一组标准头文件和库(也就是通过 --sysroot 指定的 sysroot)。将这些东西捆绑在一起的最简单方法是下载 wasi-sdk ( https://github.com/WebAssembly/wasi-sdk )。

标题还包括--target=wasm64哪个不是有效的东西,所以现在你想要,--target=wasm32虽然如果你使用 wasi-sdk clang,无论如何这都是默认的。


推荐阅读