使用 Clang 为 RISC-V 进行编译

2024-01-06

我正在尝试使用构建一个 hello world 程序Clang(版本 12.0.1)适用于 RISC-V 架构。我已经安装了它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 https://llvm.org/docs/GettingStarted.html#local-llvm-configuration, 默认LLVM_TARGETS_TO_BUILD is 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.

同时,/opt/risv/,我安装的地方riscv-gnu-toolchain,在我的路上,我可以跑riscv64-unknown-linux-gnu-gcc hello_world.c -o hello_world没有问题。

我正在使用内核的 Ubuntu 机器上尝试5.8.0-63-generic.

知道如何解决这个问题并能够通过 Clang 编译 RISC-V 程序吗?


预知:

我对此也有同样的错觉:“如果 llvm 的目标是包括 riscv 在内的所有后端,我们应该能够编译我们的代码,只需给出一个 clang 标志,例如--target=riscv32, -target riscv64等等,无需进行额外的操作”,我有类似的问题 https://stackoverflow.com/questions/66285885/clang-compiler-couldnt-find-c-c-standard-libraries-when-i-gave-a-spesific-tar,但事实并非如此。虽然LLVM支持riscv目标,但您需要指定sysroot https://stackoverflow.com/questions/39920712/what-is-a-sysroot-exactly-and-how-do-i-create-one and 海湾合作委员会工具链 https://stackoverflow.com/questions/50307733/what-is-a-gcc-toolchain要使用 riscv 标头和库,换句话说,您需要cross compilation。 (因为你当前运行的是 x86-64 等与 riscv 不同的系统,并且你的默认库也不同)这就是为什么你需要链接你的riscv-gnu-toolchain路径。在这里我假设你建立了你的riscv-gnu-工具链 https://github.com/riscv/riscv-gnu-toolchain来自 github 克隆。

Note: 有些人对第一个选项 (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 构建目录中:

cmake --build .

这是我的例子,根据您的 cmake 配置进行清理:

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"

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

For C:

/home/shc/llvm/llvm-project/build/bin/clang -march=rv64gc hello_world.c -o hello_world

For C++:

/home/shc/llvm/llvm-project/build/bin/clang++ -march=rv64gc hello_world.cpp -o hello_world

如果您没有使用 cmake 标志设置默认目标三重,target选项应保留:

For C:

/home/shc/llvm/llvm-project/build/bin/clang --target=riscv64 -march=rv64gc hello_world.c -o hello_world

For C++:

/home/shc/llvm/llvm-project/build/bin/clang++ --target=riscv64 -march=rv64gc hello_world.cpp -o hello_world

2-)你可以通过sysroot https://stackoverflow.com/questions/39920712/what-is-a-sysroot-exactly-and-how-do-i-create-one and 海湾合作委员会工具链 https://stackoverflow.com/questions/50307733/what-is-a-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_world

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.cpp -o hello_world

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

对于 32 位 riscv:

-target riscv32-unknown-linux-elf

对于 64 位 riscv:

-target riscv64-unknown-linux-elf

4-)您可以使用riscv-llvm 仓库 https://github.com/sifive/riscv-llvm遵循给定的说明,尽管它已经过时了。

Note:我根据您的示例调整了我的文件位置,以便更好地理解。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Clang 为 RISC-V 进行编译 的相关文章

  • 防止运行测试时优化掉未使用的静态函数

    我正在编写一个将利用 LLVM 的库 通过inkwell https github com TheDan64 inkwell 来 JIT 编译一些函数 这些函数需要能够回调我的代码中的一些 Rust 函数 我让它工作 但我的单元测试不起作用
  • Clang 标志的完整列表

    在哪里可以找到 Clang 标志的完整列表 有一些 比如 include pch 这似乎没有在手册页中列出 我知道 GCC 使用一些相同的标志 但它不包括类似的文档 Os我相信这仅在 Clang 中可用 是否有地方可以找到所有 Clang
  • 使用 clang 的 ThreadSanitizer 和 TBB 避免误报

    有没有人尝试过clang 的 ThreadSanitizer http clang llvm org docs ThreadSanitizer html with 英特尔线程构建模块 TBB http en wikipedia org wi
  • 从无符号除法结果分配时有关符号转换的警告

    我编译了以下代码 Wsign conversion int main unsigned int a 8 int b a 8u warning implicit conversion changes signedness unsigned i
  • 这个使用 的简单 C++ 程序正确吗?

    这段代码似乎在 gcc 和 clang 的 ubuntu 可信 版本中工作正常 并且通过 mingw 在 VM 上的 Win 7 中工作正常 最近我升级到 Wily 并使用 clang 构建的版本始终崩溃 include
  • 如何在其他src文件夹中包含头文件

    我有一个 C 项目 有两个 src 文件夹 文件夹1中的源文件可能需要包含src文件夹2中的头文件 这可能吗 或者我应该如何编写我的 Makefile 谢谢 根据两个文件夹的相关程度 例如 如果它们是同一个项目 那么它可以很简单 inclu
  • 在 Android Studio MacOS 中清理项目时出现“ninja”错误

    我在 macos mojave 中使用 Android Studio 3 5 我有一个项目 在一个文件夹中包含 java 和 ndk 代码 我们称之为 project folder A 我复制了这个文件夹 将其重命名为 project fo
  • 让 clang-tidy 修复头文件

    我正在将当前使用 gcc 编译的项目移至 clang 并有一堆 gcc 没有生成的警告 Winconsistent missing override clang tidy致力于修复这些错误 cpp文件 但是它不触及hpp文件 因为在数据库中
  • 使用 OpenCL 支持构建 OpenCV

    在 CMake 中 我使用 OpenCL Enable ON 构建了 OpenCV 它自动检测到OPENCL INCLUDE DIR路径但是OPENCL LIBRARY即使单击配置后也是空的 为了OPENCL LIBRARY我也没有看到浏览
  • 如何让 gcc/clang 警告 switch 语句中缺少中断

    有什么办法可以使gcc or clang警告 switch 语句中缺少中断 具体来说 我几乎总是希望 case 语句以中断结束 如果我不这样做的话 如果我能让编译器抱怨 那就太好了 如果它会寻找一个break语句或一个 fall throu
  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 编译错误:linux/module.h:没有这样的文件或目录

    我写了一个简单的模块 define KERNEL define MODULE include
  • Windows 铿锵声Hello World lnk4217

    我已经安装了 clang 版本 6 0 以及 Visual Studio 2017 我正在编译一个简单的 hello world 应用程序 include
  • 如何在命令提示符下运行Java程序

    我创建了一个 Java 项目来调用 Web 服务 它有一个主 java 文件和另一个类文件 我已经为 HTTP 客户端使用了一些 jar 文件 在 Eclipse 中运行良好 我需要通过传递一些参数在命令提示符下运行 Java 程序 在命令
  • 为什么Delphi打开时间越长编译速度就越慢,我该怎么办?

    我的公司十多年来一直在德尔福上运行一个大型项目 我们的代码库多年来一直在增长 目前代码数量约为 400 万行 编译速度正在成为一个问题 我们花了时间清除单元循环引用 编译缓慢的已知原因 并检查了设置的各个方面 已经到了我们无法通过我们所能控
  • c++1y 模式下的 Clang >= 3.3 无法解析 标头

    我有一个项目可以在 g 4 8 1 和 c 11 模式下 clang gt 3 3 下正确编译和运行 然而 当我切换到实验时 std c 1y模式下 clang 3 3 但不是 g 在
  • 为什么 -march=native 很少使用?

    对于大多数 C C 编译器 有一个可传递给编译器的标志 march native 它告诉编译器调整为主机 CPU 的微架构和 ISA 扩展生成的代码 即使它的名称不同 基于 LLVM 的编译器通常也有一个等效的选项 例如rustc or s
  • 如何在 conda 中静音或抑制 gfortran (或 clang?)后端?

    我一直致力于构建一个非常特殊的 conda 环境 专为python and R与串扰使用rpy2 我想出的方法可以安装正确的R包如下 install main environment sh now date T echo Start Tim
  • 不必要的包含文件是否会产生开销?

    我看到了几个关于如何检测 C 项目中不必要的 include 文件的问题 这个问题经常引起我的兴趣 但我一直没有找到满意的答案 如果包含一些未在 C 项目中使用的头文件 这是一种开销吗 我理解这意味着在编译之前 所有头文件的内容将被复制到包
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM

随机推荐

  • 无法读取未定义的属性“totalPrice”

    我的 Angular 2 模板上有这段代码 td class hidden xs text center strong Total 8369 carts totalPrice strong td 当我登录时carts totalPrice在
  • 带有动态子项的 Flutter 可滚动布局

    我想创建一个通用布局 它接受子 Widget 作为参数 其内容布局如下 我在顶部有一个应用程序栏 有一个标题 标题 下面是内容 可以是任何内容 在底部 我有一个带有几个按钮的列 如果内容对于屏幕来说太大 则除 AppBar 之外的所有这些小
  • 什么时候需要 TCP 选项 SO_LINGER (0)?

    我想我理解该选项的正式含义 在我现在处理的一些遗留代码中 使用了该选项 客户抱怨 RST 是其一侧对 FIN 的响应 其连接距离其一侧较近 我不确定是否可以安全地删除它 因为我不知道何时应该使用它 您能否举例说明何时需要该选项 对于我的建议
  • C - 函数类型冲突错误

    我是 C 新手 我试图从用户那里获取大量文本并计算单词 字符 行 空格和字母的数量 这就是我所做的 include
  • 通过 webhook 接收关于创建和删除 Outlook 事件的额外更新更改通知

    我希望收到有关创建 更新和删除 Outlook 事件的更改通知 我通过以下方式创建了订阅https learn microsoft com en us graph change notifications delivery webhooks
  • 从给定的日期范围列表中查找所有重叠的日期范围

    我有一个 BookingDateRange 列表 其中 BookingDateRange 是 public class BookingDateRange private Date fromDate private Date toDate g
  • 如何使用msbuild替换文件中的字符串?

    我想用另一个文件 xy xml 中的字符串 i am Fine 替换文件 test xml 中的 how r u 等字符串 在 ms build 中使用正则表达式 即我必须从一个文件 xy xml 读取字符串并将其替换为另一个文件test
  • Google App Engine - 缓存生成的 HTML

    我编写了一个 Google App Engine 应用程序 它以编程方式生成一堆 HTML 代码 对于登录到我的系统的每个用户来说 这些代码实际上是相同的输出 而且我知道当代码投入生产时 这将是低效的 因此 我试图找出缓存生成页面的最佳方法
  • 处理中带有 Alpha 通道的视频

    我想知道是否有人可以出色地帮助我完成我正在做的事情Processing 我需要在实时源上播放带有透明度的视频文件 以便视频不仅仅是一个矩形 这是我认为需要添加或更改的代码部分 我对这一切都非常陌生 我非常感谢任何可以提供帮助的人 如果您的视
  • C#:异常 - 参数无效 - 表单 Dispose 方法

    在处置时object of a form从另一个exception正在投掷像Parameter is not valid 访问第二种形式的代码 Assembly X Assembly LoadFile Application Startup
  • 在同级元素的单击事件上从内存中删除 Image() 对象 - JavaScript

    我有一个使用 JavaScript 的图像预览器Image 对象在使用 PHP 处理之前预览图像 我有一个包含 x SVG 图形的 div 该图形的目标是通过单击事件来删除图像 在下面的代码中 它使用的函数底部evt target如果用户愿
  • 将 dll 添加到引用后,类库智能感知未显示

    在 C 中 我创建了一个具有一个命名空间和一个类的 ClassLibrary 我保存并构建了它 在其他项目中 当我使用它时 我通过浏览到 dll 位置将其添加到我的引用中 但问题是它的名字没有出现在智能感知中 即当我 using 我的dll
  • 将数据库部署到 Azure SQL 失败,找不到 sp_MSforeachtable

    我正在尝试使用发布 SQL Server 数据库 dacpac并将配置文件发布到 Azure SQL 数据库 我们已经使用本地 SQL Server 很长一段时间了 没有出现任何问题 现在我们正在评估 Azure 和 AWS 看看哪一个最适
  • 阻止所有混合内容

    我怎样才能完全防止任何混合内容 https developer mozilla org en US docs Web Security Mixed content从加载 当前的浏览器已经被阻止active混合内容 脚本 我真正想要的是阻止所
  • 由于 Yoga 错误,React Native iOS 构建失败

    我从博览会中退出到纯反应本机项目 IOS 项目未按预期运行 我得到的错误是 ReactCommon yoga yoga YGEnums h No such file or directory 更多错误如下所示 error Failed to
  • 如何在 Android 中自定义权限对话框?

    假设我在运行时请求如下所示的权限 ActivityCompat requestPermissions thisActivity new String Manifest permission READ CONTACTS MY PERMISSI
  • Opencart 登录后登录到上一个查看的页面?

    Opencart 登录后登录到上一个查看的页面 有人知道可以做到这一点的方法吗 正在开发版本 1 5 4 希望有人可以建议 帮助 Thanks 为了实现这个场景 用户单击登录链接 用户填写登录表单并单击提交按钮 他登录后 您希望他重定向到他
  • 使用卡方检验在文档特征矩阵中进行特征选择

    我正在使用自然语言处理进行短信挖掘 我用了quanteda包生成文档特征矩阵 dfm 现在我想使用卡方检验进行特征选择 我知道已经有很多人问过这个问题了 但是 我找不到相关的代码 答案只是给出了一个简短的概念 如下所示 https stat
  • 如何在 Pygame 中围绕偏心轴旋转图像

    我想围绕一个枢轴旋转图像 该枢轴不在图像的中心Surface https www pygame org docs ref surface html in Pygame https www pygame org news 枢轴是图像中的绿色十
  • 使用 Clang 为 RISC-V 进行编译

    我正在尝试使用构建一个 hello world 程序Clang 版本 12 0 1 适用于 RISC V 架构 我已经安装了它LLVM 版本 12 0 1 具有以下设置 cmake G Unix Makefiles DLLVM ENABLE