我目前正在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++编译器,添加一个我需要的优化。
实际上,我正在尝试编译riscv target的代码,使用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/riscv32-unknown-elf-clang++这样的riscv bin工具中使用clang吗(我在网上看到了类似的东西,但是找不到),在我的riscv目录中添加和构建一个子模块?
编辑:正如@NateEldredge所说,对于x86_64目标triple应该--target=x86_64-linux-gnu,但对于作为目标triple riscv32-unknown-elf的riscv,我仍然有相同的错误。除了--target=riscv32-unknown-elf之外,riscv有没有合适的目标标志?也许我忽略了这一点。
发布于 2021-07-29 22:12:54
我通过将编译与构建的riscv-gnu-toolchain链接起来解决了我的问题,并在这里详细回答了一个类似的问题: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
https://stackoverflow.com/questions/66285885
复制相似问题