花了2年时间搭建的树莓派交叉编译环境

从23年开始接触c++编程,程序运行在树莓派4B上,虽然是新手,但我也知道需要交叉编译,交叉编译的好处如下:1、在自己的windows电脑上就可以开发;2、编译速度比直接在树莓派编译快。可按照网上的教程一直无法搭建成功,同时也找了个十多年的c++高手,但还是没有搞定。

我就这样在树莓派本机上开发了2年多,为了能够看清树莓派桌面,每次开发一下各种折腾,插电脑显示器,调整树莓派图像显示方向......

事隔两年多,搭建交叉编译环境这件事如鲠在喉,让我久久不能放下。于是在25年过完年还不算太忙的情况下,我花费了一周时间总算是找到了正确的方法。

本次搭建的环境基于:Ubuntu 16.04.7 LTS操作系统,树莓派4B,树莓派操作系统为armv7架构(树莓派操作系统架构见下一篇文章)。主要流程有以下四步:

一、安装虚拟机

下载VMwareWorkstation虚拟机,安装Ubuntu 16.04.7 LTS镜像,硬盘大小设置为100GB,内存8G,处理器内核总数为8。

二、拷贝树莓派上的系统文件到虚拟机

注意:这里的登录用户不能是root用户

1. 宿主机上创建目录

mkdir -p ~/sysroot/usr

2. 拷贝/lib目录

从树莓派拷贝/lib目录到宿主机/home/user/sysroot目录下,建议直接拿U盘拷贝。

3. 拷贝/usr/include目录

从树莓派拷贝/usr/include目录下的文件到宿主机/home/user/sysroot/usr/include目录下。

4. 拷贝/usr/lib目录

从树莓派拷贝/usr/lib目录下的文件到宿主机/home/user/sysroot/usr/lib目录下。

三、通过ct-ng构建交叉编译工具链

注意:这里的登录用户不能是root用户

1. 安装ct-ng

1.1 安装依赖

sudo apt update && sudo apt install build-essential libtool automake flex bison gperf texinfo help2man

1.2 清除可能干扰的环境变量

unset CC CXX CPP CFLAGS CXXFLAGS CPPFLAGS LDFLAGS

1.3 下载ct-ng源码

/opt目录执行如下命令:

git clone https://github.com/crosstool-ng/crosstool-ng.git

1.4 进入源码目录:

cd crosstool-ng

1.5 编译

./bootstrap
./configure --prefix=/usr/local
make -j$(nproc) V=1

1.6 安装

make install

2. 配置ct-ng

2.1 初始化配置

此处是设置目标设备的操作系统。先执行如下命令获取支持的操作系统:

ct-ng list-samples 

我的树莓派4B的操作系统为armv7硬浮点(关于硬浮点和软浮点会在后续文章中说到)版本,在上面命令获取到的系统中没有树莓派4B的,我选择了armv7-rpi2-linux-gnueabihf。获取到的部分操作系统截图如下:

确定好自己的系统后,运行如下命令进行设置:

ct-ng armv7-rpi2-linux-gnueabihf

2.2 配置 glibc 版本

进入交互式配置菜单
ct-ng menuconfig
进入主界面,如下图:

用键盘的上下箭头进行切换,选择C-library,回车;选择Version of glibc ,回车;选择2.28,回车。按键盘右箭头,将底部的菜单移动到[Save],然后回车,然后[Exit]:

C-library  --->
  Version of glibc  --->
    (2.28) Custom glibc version

2.3 配置内核头文件:

在主界面选择【操作系统】:

回车,如下图:

选择【Version of linux】,回车,如下图:

选择4.19版本,回车,如下图:

2.4 配置Binary utilities

主界面选择【Binary utilities】,如下图:

回车,进入下图:

选择【Version of binutils】,回车,进入下图:

选择2.30,回车,进入下图:

2.5 配置C compiler

一直按下边【Exit】菜单,返回主界面,选择【C compiler】,如下图:

回车,进入下图:

选择【Version of gcc】,回车,进入下图:

移动键盘下方向键到7.5.0,然后回车,进入下图:

好了,配置就完成了。

3. 构建

执行如下命令开始构建:

ct-ng build

中间可能会出现错误,比如下载某个依赖出错,解决的思路就是自己动手下载后放在源码路径下。比如我这里下载zlib 失败,出现如下错误:

我就在自己电脑上下载好这个文件,拷贝到虚拟机下ct-ng的构建源码目录,如下图:

ct-ng的构建源码目录查看方法:打开配置主界面,如下图:

选择【Path and misc options】,回车,进入下图:

图中的$HOME/src就是构建时的源码目录,执行如下命令,获取到完整路径:

echo $HOME/src

继续编译,执行如下命令,大约四十分钟执行完成:

ct-ng build

4. 配置环境变量:

export TOOLCHAIN_ROOT=~/x-tools/armv7-rpi2-linux-gnueabihf
export PATH="${TOOLCHAIN_ROOT}/bin:${PATH}"
export TARGET=armv7-rpi2-linux-gnueabihf
export SYSROOT=/home/user/sysroot

注意:以上配置只在当前会话终端中有效,如果需要永久生效,那就需要修改 ~/.bashrc 文件,执行如下命令:

nano ~/.bashrc

 在文件末尾添加以下内容:

# 交叉编译工具链配置
export TOOLCHAIN_ROOT=~/x-tools/armv7-rpi2-linux-gnueabihf
export PATH="${TOOLCHAIN_ROOT}/bin:${PATH}"
export TARGET=armv7-rpi2-linux-gnueabihf  # 必须与工具链目录名一致
export SYSROOT=/home/user/sysroot

Nano 编辑器:按 Ctrl + O 保存 → 按 Ctrl + X 退出

执行:

source ~/.bashrc

验证配置:

# 检查变量是否生效
echo $TARGET       # 应输出 armv7-rpi2-linux-gnueabihf
echo $TOOLCHAIN_ROOT  # 应输出 /home/user/x-tools/armv7-rpi2-linux-gnueabihf
which ${TARGET}-gcc  # 应输出工具链路径,如 ~/x-tools/.../bin/armv7-rpi2-linux-gnueabihf-gcc

# 测试编译器
${TARGET}-gcc --version

四、测试

执行如下命令,写一个测试程序:

vim test.c

程序内容为:

#include <stdio.h>
#include <wiringPiI2C.h>

int main()
{
int  fd = wiringPiI2CSetup(0x77);
printf("%d\n", fd);
printf("hello raspberry 2025 02 18 18 23 00 \n");
return 0;
}       

执行如下编译命令:

${TARGET}-gcc -I/home/user/sysroot/usr/include -L/home/user/sysroot/lib   -o /home/user/test1045 /home/user/test.c -lwiringPi

如果执行后,没有任何输出,那么编译成功了。这时候通过如下指令查看编译结果:

file test1045

如果你的结果也是ELF 32-bit LSB executable, ARM,那就恭喜你完成了树莓派armv7的交叉编译环境搭建。现在可以将编译后的程序发送到树莓派进行进一步验证了。

如上图所示,在树莓派上程序运行正常。

其他可能出现的问题:

ct-ng menuconfig
.config is not a regular file:
drwx------ 18 user user 4096 Feb  4 18:25 .config
/usr/local/bin/ct-ng:119: recipe for target 'check-config' failed
make: *** [check-config] Error 1

解决办法:该问题是多次配置ct-ng时,没有保存配置结果,导致生成错误,config文件被当作了一个目录,执行如下命令:

# 备份目录(如果其中有重要文件)
mv .config .config-backup

# 删除目录(确认已备份后操作)
rm -rf .config

# 初始化默认配置(生成新的 .config 文件)
ct-ng defconfig

# 进入配置菜单
ct-ng menuconfig

重新配置后,再次构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值