我正在尝试使用Clang (版本12.0.1)为RISC-V架构构建一个hello world程序。我已经用LLVM (版本12.0.1)安装了它,安装步骤如下:
cmake -G "Unix Makefiles" \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;libcxx;libcxxabi;libunwind;lldb;compiler-rt;lld;polly;debuginfo-tests" \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_ENABLE_ASSERTIONS=On \
../llvm根据here的说法,默认LLVM_TARGETS_TO_BUILD是LLVM_ALL_TARGETS,其中包括RISC-V。
所以我尝试用clang --target=riscv64 -march=rv64gc hello_world.c -o hello_world编译它,我得到了错误:
hello_world.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^~~~~~~~~
1 error generated.同时,我安装了riscv-gnu-toolchain的/opt/risv/在我的path中,我可以毫无问题地运行riscv64-unknown-linux-gnu-gcc hello_world.c -o hello_world。
我在一台安装了5.8.0-63-generic内核的Ubuntu机器上试用。
你知道我怎样才能解决这个问题并且能够通过Clang编译RISC-V程序吗?
发布于 2021-07-29 21:44:33
Foreknowledge:
我对此有同样的错觉:“如果llvm的目标是所有的后端,包括riscv,我们应该能够编译我们的代码,只需要给出一个像--target=riscv32,-target riscv64等这样的clang标志,而不需要做额外的操作”,我有similar question,但它不是这样的。尽管LLVM支持riscv target,但是您需要指定sysroot和gcc toolchain来使用riscv头文件和库,换句话说,您需要cross compilation。(因为您当前运行的x86-64系统与riscv不同,并且您的默认库也不同),这就是您需要链接riscv-gnu-toolchain路径的原因。在这里,我假设您是从github克隆构建的riscv-gnu-toolchain。
注意:有些人对第一个选项(1)有问题,请先尝试使用其他选项(2) (3) (4)。(查看评论)
解决方案:
1-)在构建您的llvm库之前,您可以添加以下行作为您的cmake配置标志:
对于32位riscv:
-DDEFAULT_SYSROOT="{your-riscv-gnu-toolchain-install-or-build-path}/riscv32-unknown-elf"
-DGCC_INSTALL_PREFIX="{your-riscv-gnu-toolchain-install-or-build-path}"对于64位riscv:
-DDEFAULT_SYSROOT="{your-riscv-gnu-toolchain-install-or-build-path}/riscv64-unknown-elf"
-DGCC_INSTALL_PREFIX="{your-riscv-gnu-toolchain-install-or-build-path}"然后再次构建llvm库。您可能知道,在您的llvm build目录中:
cmake --build .下面是我的例子,根据你的cmake配置,用于clearance:
cmake -G "Unix Makefiles" \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;libcxx;libcxxabi;libunwind;lldb;compiler-rt;lld;polly;debuginfo-tests" \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_ENABLE_ASSERTIONS=On \
-DDEFAULT_SYSROOT="/home/shc/riscv/install/riscv64-unknown-elf" \
-DGCC_INSTALL_PREFIX="/home/shc/riscv/install" \
../llvm
cmake --build .您还可以使用另一个cmake配置标志将默认目标三元组设置为riscv:
对于32位riscv:
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv32-unknown-elf"对于64位riscv:
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf"在此之后,您应该能够像以下示例一样编译代码:
对于C语言:
/home/shc/llvm/llvm-project/build/bin/clang -march=rv64gc hello_world.c -o hello_world对于C++:
/home/shc/llvm/llvm-project/build/bin/clang++ -march=rv64gc hello_world.cpp -o hello_world如果您没有使用cmake标志设置默认目标三元组,则target选项应该保持不变:
对于C语言:
/home/shc/llvm/llvm-project/build/bin/clang --target=riscv64 -march=rv64gc hello_world.c -o hello_world对于C++:
/home/shc/llvm/llvm-project/build/bin/clang++ --target=riscv64 -march=rv64gc hello_world.cpp -o hello_worldcmake 2-)您可以在编译代码时将sysroot和gcc toolchain作为标志传递(就像上面的cmake配置一样),而无需重新构建库。然而,如果你要使用它,你需要在每次编译中给出这些标志:
对于32位riscv:
--sysroot="{your-riscv-gnu-toolchain-install-or-build-path}/riscv32-unknown-elf"
--gcc-toolchain="{your-riscv-gnu-toolchain-install-or-build-path}"对于64位riscv:
--sysroot="{your-riscv-gnu-toolchain-install-or-build-path}/riscv64-unknown-elf"
--gcc-toolchain="{your-riscv-gnu-toolchain-install-or-build-path}"C的标志的用法:
/home/shc/llvm/llvm-project/build/bin/clang --sysroot=/home/shc/riscv/install/riscv64-unknown-elf --gcc-toolchain=/home/shc/riscv/install --target=riscv64 -march=rv64gc hello_world.c -o hello_worldC++的标志用法:
/home/shc/llvm/llvm-project/build/bin/clang++ --sysroot=/home/shc/riscv/install/riscv64-unknown-elf --gcc-toolchain=/home/shc/riscv/install --target=riscv64 -march=rv64gc hello_world.cpp -o hello_world3-)您可以尝试在编译时传递这些标志(而不是您的--target=riscv64标志),尽管它并不比上面的选项更健康。(注意:区别只在于linux关键字,通常是-target riscv32-unknown-elf):
对于32位riscv:
-target riscv32-unknown-linux-elf对于64位riscv:
-target riscv64-unknown-linux-elf4-)您可以按照给定的说明使用riscv-llvm repo,尽管它已过时。
注意:为了更好地理解,我根据您的示例调整了我的文件位置。
欲了解更多信息,请点击此处:https://github.com/lowRISC/riscv-llvm#how-can-i-build-upstream-llvmclang-and-use-it-to-cross-compile-for-a-riscv32-target
发布于 2021-11-11 06:51:27
我终于要处理这个问题了!我使用了下一个键:
cmake -G "Unix Makefiles" \
-DCMAKE_BUILD_TYPE="Release" \
-DBUILD_SHARED_LIBS=True \
-DCMAKE_INSTALL_PREFIX="/home/username/llvm-install" \
-DLLVM_OPTIMIZED_TABLEGEN=ON -DLLVM_BUILD_TESTS=False \
-DDEFAULT_SYSROOT="/home/username/esp-toolchain-install/riscv64-unknown-elf" \
-DGCC_INSTALL_PREFIX="/home/username/esp-toolchain-install" \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf" \
-DLLVM_TARGETS_TO_BUILD="RISCV" ../llvm我将esp-toolchain-install/*的内容复制到了llvm-install/*中。clang最终看到了所有的GCC文件:
clang -v -print-search-dirs
clang version 12.0.1 (https://github.com/llvm/llvm-project.git fed41342a82f5a3a9201819a82bf7a48313e296b)
Target: riscv64-unknown-unknown-elf
Thread model: posix
InstalledDir: /home/username/llvm-install/bin
Found candidate GCC installation: /home/username/llvm-install/bin/../lib/gcc/riscv64-unknown-elf/9.2.0
Selected GCC installation: /home/username/llvm-install/bin/../lib/gcc/riscv64-unknown-elf/9.2.0
Candidate multilib: rv32i/ilp32;@march=rv32i@mabi=ilp32
Candidate multilib: rv32im/ilp32;@march=rv32im@mabi=ilp32
Candidate multilib: rv32iac/ilp32;@march=rv32iac@mabi=ilp32
Candidate multilib: rv32imac/ilp32;@march=rv32imac@mabi=ilp32
Candidate multilib: rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f
Candidate multilib: rv64imac/lp64;@march=rv64imac@mabi=lp64
Candidate multilib: rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d
Selected multilib: rv64imac/lp64;@march=rv64imac@mabi=lp64
programs: =/home/username/llvm-install/bin:/home/username/llvm-install/bin/../lib/gcc/riscv64-unknown-elf/9.2.0/../../../../riscv64-unknown-elf/bin:/home/username/llvm-install/bin/../lib/gcc/riscv64-unknown-elf/9.2.0/../../../../bin
libraries: =/home/username/llvm-install/lib/clang/12.0.1:/home/username/llvm-install/bin/../lib/gcc/riscv64-unknown-elf/9.2.0/rv64imac/lp64:/home/username/llvm-install/bin/../lib/gcc/riscv64-unknown-elf/9.2.0/../../../../riscv64-unknown-elf/lib/rv64imac/lp64:/home/username/llvm-install/bin/../lib/gcc/riscv64-unknown-elf/9.2.0:/home/username/esp-toolchain-install/riscv64-unknown-elf/libhttps://stackoverflow.com/questions/68580399
复制相似问题