make riscv.obj on x86: 交叉编译

本文详细介绍了如何在Debianx86机器上为MILKV-DUORISC-V开发板进行C语言程序的交叉编译,包括安装编译工具链、编写和编译程序,以及注意静态链接的使用。

0. 前言

最近泰晓社区捐了几块 RISCV 的开发板给 JLULUG,作为 JLULUG 的最菜的萌新,被社团领导指派来试水。我们拿到的开发板是 MILKV-DUO,上面跑着一个几乎极简的 buzybox linuxssh 服务端用的是 dropbear

本文内容旨在介绍如何在一台装有 Debianx86 机器上交叉编译出一个能够在 MILKV-DUO 上能够运行的程序。

1. 安装编译工具链

  • 正确配置 apt 镜像源(略)
  • 安装交叉编译工具链 gcc-riscv64-linux-gnu
sudo apt update
sudo apt install gcc-riscv64-linux-gnu

2. 写一个 c 语言程序

  • 把线面内容存在 hello.c
#include <stdio.h>
int main() {
    printf("Hello World!\n");
    return 0;
}

3. 编译

riscv64-linux-gnu-gcc -static hello.c -o hello
  • 这里一定要使用 -static 参数,因为我们不能保证目标运行环境中有我们需要的动态链接库

4. 运行

  • 把可执行文件 hello 发送到 RISCV 开发板上运行即可
    在这里插入图片描述
Makefile工程文件移植到MounRiver Studio 报错 13:10:47 **** 构建 of configuration obj for project CH32V307VCT6 **** make -j12 all In file included from ../programmer/cdc.c:6: C:\Users\biaog\Desktop\CH32V307VCT6\vendor\Peripheral\inc/ch32v30x.h:183:10: fatal error: core_riscv.h: No such file or directory #include "core_riscv.h" ^~~~~~~~~~~~~~ compilation terminated. make: *** [programmer/subdir.mk:65: programmer/cdc.o] Error 1 make: *** Waiting for unfinished jobs.... In file included from ../programmer/clock.c:7: C:\Users\biaog\Desktop\CH32V307VCT6\vendor\Peripheral\inc/ch32v30x.h:183:10: fatal error: core_riscv.h: No such file or directory #include "core_riscv.h" ^~~~~~~~~~~~~~ compilation terminated. make: *** [programmer/subdir.mk:65: programmer/clock.o] Error 1 In file included from ../programmer/flash.c:6: C:\Users\biaog\Desktop\CH32V307VCT6\vendor\Peripheral\inc/ch32v30x.h:183:10: fatal error: core_riscv.h: No such file or directory #include "core_riscv.h" ^~~~~~~~~~~~~~ compilation terminated. make: *** [programmer/subdir.mk:65: programmer/flash.o] Error 1 In file included from ../programmer/fsmc_nand.c:8: C:\Users\biaog\Desktop\CH32V307VCT6\vendor\Peripheral\inc/ch32v30x.h:183:10: fatal error: core_riscv.h: No such file or directory #include "core_riscv.h" ^~~~~~~~~~~~~~ compilation terminated. make: *** [programmer/subdir.mk:65: programmer/fsmc_nand.o] Error 1 In file included from ../programmer/jtag.c:6: C:\Users\biaog\Desktop\CH32V307VCT6\vendor\Peripheral\inc/ch32v30x.h:183:10: fatal error: core_riscv.h: No such file or directory #include "core_riscv.h" ^~~~~~~~~~~~~~ compilation terminated. make: *** [programmer/subdir.mk:65: programmer/jtag.o] Error 1 13:10:52 Build Failed. 11 errors, 0 warnings. (took 5s.146ms)
07-10
<think>我们正在处理用户关于MounRiver Studio移植Makefile工程时遇到core_riscv.h文件缺失的问题。 根据引用[2]中提到的Makefile知识,我们知道Makefile工程需要正确设置头文件路径和依赖关系。 用户报错提示找不到core_riscv.h,这通常是因为头文件路径没有正确包含或者该头文件确实不存在于工程中。 解决方案步骤: 1. 确认core_riscv.h文件是否存在:在工程目录中搜索该文件,看是否被包含在工程中。通常,这个文件是RISC-V内核相关的头文件,可能由芯片厂商提供。 2. 如果文件存在,检查Makefile中的头文件包含路径(-I参数)是否包含了该文件所在的目录。 3. 如果文件不存在,需要从芯片厂商提供的SDK或固件库中获取该文件,并放置到工程中的合适位置(例如include目录),然后在Makefile中添加该路径。 另外,引用[1]提到在VSCode中使用make编译STM32工程,引用[3][4]提到Android Studio的移植,引用[5]提到RTduino支持的一些板卡,这些引用虽然不直接解决RISC-V问题,但提供了工程移植的通用思路:确保必要的头文件和库文件正确包含。 具体到MounRiver Studio(一个基于Eclipse的RISC-V开发环境),它可能使用了自己的构建系统,但用户使用的是Makefile工程,因此我们需要确保Makefile的配置符合MounRiver Studio的目录结构或要求。 详细步骤: 1. 在工程目录中查找core_riscv.h文件: - 如果找到,记下其路径,然后在Makefile的INCLUDE路径(通常是CFLAGS中的-I选项)中添加该路径。 - 如果没有找到,需要从其他地方获取。例如,从芯片厂商的SDK中获取,或者从MounRiver Studio的安装目录中查找是否有提供该头文件。 2. 修改Makefile,添加头文件路径。例如,假设头文件在./include目录下,则添加: CFLAGS += -I./include 3. 如果用户使用的是特定的RISC-V内核,可能需要确认该头文件是否与内核版本匹配。有时,头文件可能需要根据芯片型号进行配置。 4. 清理并重新编译工程。 如果用户已经尝试了上述步骤仍然有问题,可能需要检查MounRiver Studio的环境变量设置,或者查看工程是否依赖了特定的SDK包。 考虑到用户可能不太熟悉MounRiver Studio,我们可以建议用户检查MounRiver Studio是否提供了类似STM32的固件库,其中应包含core_riscv.h。 此外,引用[5]提到RTduino支持的一些板卡,说明用户可能在开发嵌入式系统,因此可能需要确认所使用的RISC-V开发板是否有特定的固件库。 生成相关问题: 1. 如何为RISC-V芯片添加固件库? 2. MounRiver Studio中如何配置Makefile工程的头文件路径? 3. 如何确认core_riscv.h是否与当前RISC-V内核兼容?</think>### 解决MounRiver Studio移植Makefile工程时core_riscv.h缺失问题 #### 问题分析 `core_riscv.h`是RISC-V芯片的核心头文件,包含处理器架构定义和寄存器映射。报错原因通常是: 1. **路径配置错误**:Makefile未正确包含RISC-V工具链的头文件路径 2. **SDK缺失**:工程未包含芯片厂商提供的SDK或固件库 3. **工具链不匹配**:使用的编译器与目标芯片架构不兼容 #### 解决方案步骤 1. **确认工具链头文件路径** 在Makefile中添加RISC-V工具链的标准头文件路径(通常在`${MRS_TOOLCHAIN_PATH}/riscv-none-embed/include`): ```makefile CFLAGS += -I"${MRS_TOOLCHAIN_PATH}/riscv-none-embed/include" ``` 可通过 *MounRiver Studio > 工具链配置* 查看实际路径[^2]。 2. **添加芯片厂商SDK** 从芯片官网(如GD32V、CH32V系列)下载SDK包,将以下文件复制到工程: - `core_riscv.h`(位于SDK的`Device/Include`目录) - 对应芯片的启动文件(`.S`文件) 在Makefile中引用: ```makefile CFLAGS += -I"./Device/Include" ASM_SOURCES = ./Device/Source/startup_ch32v30x.s # 示例路径 ``` 3. **检查工具链兼容性** 在Makefile中显式指定目标架构(示例为RV32IMAC): ```makefile ARCH_FLAGS = -march=rv32imac -mabi=ilp32 CFLAGS += ${ARCH_FLAGS} ``` 4. **验证头文件包含顺序** 确保在包含其他外设头文件前优先包含`core_riscv.h`: ```c // main.c示例 #include "core_riscv.h" // 必须放在首位 #include "ch32v30x_gpio.h" ``` 5. **清理并重新编译** ```bash make clean # 清除缓存 make all # 重新编译 ``` #### 工程结构建议 ``` 工程根目录/ ├── Makefile ├── Device/ │ ├── Include/ # 存放core_riscv.h及芯片头文件 │ └── Source/ # 存放启动文件 ├── User/ │ ├── main.c │ └── ... └── BUILD/ # 编译输出目录 ``` > **重要提示**:若使用厂商SDK(如WCH的CH32V系列),需确认`core_riscv.h`是否被重命名为类似`ch32v30x.h`的文件,此时应引用该文件而非`core_riscv.h`[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值