当我给出一个特定的目标时,Clang 编译器找不到 C/C++ 标准库,尽管它在没有给出目标的情况下也能工作

Clang compiler couldn't find C/C++ standard libraries when I gave a specific target although it works without giving target

我目前在 ubuntu 上使用 clang11 来编译任何 c/c++ 代码并且它工作正常但是当我尝试将任何代码(包括 any standard library)编译为汇编代码时对于像 x86_64 这样的任何特定目标(即使我有 x86_64)riscv 并给出 --target=x86_64--target=riscv32 的标志,我得到了任何标准库的错误包含在我的代码中。一个简单的例子:

// ex.cpp
#include<iostream>
int main(){
    int a = 5;
    int b = 3;
    std::cout << a - b;
}

不为特定目标提供标志也可以正常工作:

clang++-11 -S ex.cpp -o ex.s

带有 --target=riscv32 标志:

clang++-11 --target=riscv32 -S ex.cpp -o ex.s

给出了这个错误: ex.cpp:1:9: fatal error: 'iostream' file not found

即使我给出一个特定的目标,也没有标准库也不会出错。

我已经搜索了好几天的解决方案,但我找不到任何合适的解决方案来解决这个问题,他们中的大多数人说尝试包括 gnu 库和子文件夹,例如 -I/usr/include/x86_64-linux-gnu/c++/ 但它不适用于我。

请不要说使用 g++ 编译器,为了添加优化我需要 clang。

实际上我正在尝试为 riscv 目标编译我的代码,与 g++ 和 运行 spike 链接(没有区别 --target=...-target ...):

clang++-11 -target riscv32-unknown-elf -march=rv32gc -fno-addrsig -S ex.cpp -o ex.s
~/riscv/bin/riscv32-unknown-elf-g++ ex.s -o ex
~/riscv/riscv-isa-sim/build/spike --isa=RV32GC ~/riscv/riscv-pk/build/pk ex

并且在不包含标准库的情况下也能正常工作。 现在,我想问一下

我可以简单地解决这个问题吗?

我可以直接从 riscv bin utils 使用 clang,例如 ~/riscv/bin/riscv32-unknown-elf-clang++(我在网上看到类似的东西但找不到)向我的 riscv 目录添加和构建子模块吗?

编辑:正如@NateEldredge 所说,对于 x86_64 目标三元组应该 --target=x86_64-linux-gnu 但是对于 riscv 作为目标三元组 riscv32-unknown-elf 我仍然有同样的错误。除了 --target=riscv32-unknown-elf 之外,是否有适合 riscv 的目标标志?也许我忽略了这一点。

我通过将编译链接到 riscv-gnu-toolchain built and also answered a similar question here in detailed: Using Clang to compile for RISC-V

解决了我的问题

我们只需要cross-compilation。 您也可以在这里查看更多信息:https://github.com/lowRISC/riscv-llvm#how-can-i-build-upstream-llvmclang-and-use-it-to-cross-compile-for-a-riscv32-target