首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Clang为RISC-V编译

使用Clang为RISC-V编译
EN

Stack Overflow用户
提问于 2021-07-29 17:23:51
回答 2查看 2K关注 0票数 2

我正在尝试使用Clang (版本12.0.1)为RISC-V架构构建一个hello world程序。我已经用LLVM (版本12.0.1)安装了它,安装步骤如下:

代码语言:javascript
复制
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_BUILDLLVM_ALL_TARGETS,其中包括RISC-V。

所以我尝试用clang --target=riscv64 -march=rv64gc hello_world.c -o hello_world编译它,我得到了错误:

代码语言:javascript
复制
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程序吗?

EN

回答 2

Stack Overflow用户

发布于 2021-07-29 21:44:33

Foreknowledge:

我对此有同样的错觉:“如果llvm的目标是所有的后端,包括riscv,我们应该能够编译我们的代码,只需要给出一个像--target=riscv32-target riscv64等这样的clang标志,而不需要做额外的操作”,我有similar question,但它不是这样的。尽管LLVM支持riscv target,但是您需要指定sysrootgcc toolchain来使用riscv头文件和库,换句话说,您需要cross compilation。(因为您当前运行的x86-64系统与riscv不同,并且您的默认库也不同),这就是您需要链接riscv-gnu-toolchain路径的原因。在这里,我假设您是从github克隆构建的riscv-gnu-toolchain

注意:有些人对第一个选项(1)有问题,请先尝试使用其他选项(2) (3) (4)。(查看评论)

解决方案:

1-)在构建您的llvm库之前,您可以添加以下行作为您的cmake配置标志:

对于32位riscv:

代码语言:javascript
复制
-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:

代码语言:javascript
复制
-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目录中:

代码语言:javascript
复制
cmake --build .

下面是我的例子,根据你的cmake配置,用于clearance:

代码语言:javascript
复制
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:

代码语言:javascript
复制
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv32-unknown-elf"

对于64位riscv:

代码语言:javascript
复制
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf"

在此之后,您应该能够像以下示例一样编译代码:

对于C语言:

代码语言:javascript
复制
/home/shc/llvm/llvm-project/build/bin/clang -march=rv64gc hello_world.c -o hello_world

对于C++:

代码语言:javascript
复制
/home/shc/llvm/llvm-project/build/bin/clang++ -march=rv64gc hello_world.cpp -o hello_world

如果您没有使用cmake标志设置默认目标三元组,则target选项应该保持不变:

对于C语言:

代码语言:javascript
复制
/home/shc/llvm/llvm-project/build/bin/clang --target=riscv64 -march=rv64gc hello_world.c -o hello_world

对于C++:

代码语言:javascript
复制
/home/shc/llvm/llvm-project/build/bin/clang++ --target=riscv64 -march=rv64gc hello_world.cpp -o hello_world

cmake 2-)您可以在编译代码时将sysrootgcc toolchain作为标志传递(就像上面的cmake配置一样),而无需重新构建库。然而,如果你要使用它,你需要在每次编译中给出这些标志:

对于32位riscv:

代码语言:javascript
复制
--sysroot="{your-riscv-gnu-toolchain-install-or-build-path}/riscv32-unknown-elf"

--gcc-toolchain="{your-riscv-gnu-toolchain-install-or-build-path}"

对于64位riscv:

代码语言:javascript
复制
--sysroot="{your-riscv-gnu-toolchain-install-or-build-path}/riscv64-unknown-elf"

--gcc-toolchain="{your-riscv-gnu-toolchain-install-or-build-path}"

C的标志的用法:

代码语言:javascript
复制
/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_world

C++的标志用法:

代码语言:javascript
复制
/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_world

3-)您可以尝试在编译时传递这些标志(而不是您的--target=riscv64标志),尽管它并不比上面的选项更健康。(注意:区别只在于linux关键字,通常是-target riscv32-unknown-elf):

对于32位riscv:

代码语言:javascript
复制
-target riscv32-unknown-linux-elf

对于64位riscv:

代码语言:javascript
复制
-target riscv64-unknown-linux-elf

4-)您可以按照给定的说明使用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

票数 4
EN

Stack Overflow用户

发布于 2021-11-11 06:51:27

我终于要处理这个问题了!我使用了下一个键:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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/lib
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68580399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档