Buildroot定制文件系统
一、下载buildroot
buildroot官方下载链接
下载完成后解压到一个目录使用 tar -xvf buildroot***
二、开始选配
很多东西buildroot都包含了,但是不包含 gcc,在我尝试本地交叉编译gcc后放弃了,各种错误。
怎么去选择呢,再buildroot的目录执行 make menuconfig进入到一个界面(和内核选配界面一样的)
-
芯片架构
去网上找你对应芯片的具体信息,如芯片架构、核心配置
如我的3588,我就选择armV8/A76-A55
-
交叉编译的工具链主要选择gcc的版本
也把
enable C++ support选上吧 -
编译选项也没有设置
-
系统配置
主要设置一些欢迎语、用户名、密码啥的
-
kenel(不编译不管)
-
目标板的程序包(包含库、应用程序等,主要就是他)
- 里面东西很多,慢慢翻吧,善用
/搜索
- 里面东西很多,慢慢翻吧,善用
-
文件系统设置
主要设置buildroot通过什么方式给你生成的东西
-
bootloaders配置(不编译不管)
-
下面两个都没有选(我没有用上)
三、🚨添加组件
rockchip
由于我的目标板是RK3588,所以我需要一些rockchip特有的库,于是我从SDK里面提取了 rockchip的东西到我下载的buildrooot里面,如果需要可以去 电子资源里下载
下载解压后在 ./buildroot/package/Config.in添加这句话 source "package/rockchip/Config.in"

同时下载external文件夹放到 buildroot的上一层目录去

以满足上图的RKNPU2_SITE
opencv & opencv_contrib
opencv就不说了,勾选上opencv3就ok了。
重点说下opencv_contrib如何编译到opencv中
需要去改opencv3.mk 路径 package/opencv3/opencv3.mk

主要就这几个,注意路径。其他就不用设置了,他就可以编译contrib到生成的跟文件系统。
如何验证是正确编译到文件系统里面呢,这时候就需要写一个调用contrib的功能去验证,下面是一个例子
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
int main() {
// Load image
cv::Mat image = cv::imread("image.jpg");
// Convert to grayscale
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// Detect ORB keypoints
cv::Ptr<cv::ORB> orb = cv::ORB::create();
std::vector<cv::KeyPoint> keypoints;
orb->detect(gray, keypoints);
// Compute BRIEF descriptors
cv::Ptr<cv::xfeatures2d::BriefDescriptorExtractor> brief = cv::xfeatures2d::BriefDescriptorExtractor::create();
cv::Mat descriptors;
brief->compute(gray, keypoints, descriptors);
// Draw keypoints on the image
cv::Mat imageWithKeypoints;
cv::drawKeypoints(image, keypoints, imageWithKeypoints);
// Display the image with keypoints
cv::imwrite("imageWithKeypoints.jpg", imageWithKeypoints);
// cv::waitKey(0);
return 0;
}
如何编译呢,一定要用构建文件系统的交叉编译工具去编译。这么去设置,我把我fish的config文件贴出来,里面替换自己的路径,文件路径 vim ~/.config/fish/config.fish
set -gx PATH /home/codedrawing/Tools/buildroot-2023.11/output/host/bin $PATH #替换自己的路径
if status is-interactive
# Commands to run in interactive sessions can go here
end
保存退出后,一定记得 source ~/.config/fish/config.fish。然后重新开一个shell终端去执行
aarch64-linux-c++ test-contrib.cc -lopencv_world --sysroot=/home/codedrawing/Tools/buildroot-2023.11/output/host/aarch64-buildroot-linux-gnu/sysroot 这里的sysroot也是替换成buildroot生成的sysroot的位置,这里面就是包含了头文件,库等
如何可以正常编译成功,这时候拷贝到使用这个文件系统的板子上,运行,如果可以运行就说明没问题。
怎么烧写文件系统就不描述了。有问题可以评论区留言
问题
- 某些文件下载很慢

这里会出现下载这个很慢,我也传一份到电子资源中,有需要可以去下载,然后放到指定目录 ~/buildroot-2023.11/output/build/opencv4-4.1.2/buildroot-build/downloads/xfeatures2d
-
编译错误1

替换
ipcp-unit-growth为ipa-cp-unit-growth进入
vim ./output/build/opencv4-4.1.2/buildroot-build/3rdparty/carotene/hal/carotene/CMakeFiles/carotene_objs.dir/build.make,然后输入:%s/ipcp-unit-growth/ipa-cp-unit-growth/,然后保存退出
定制系统
定制显示路径
默认的buildroot里面没有显示路径,只显示了一个 #,要修改也很简单:
vim /etc/profile
# 在最后添加
PS1='\u@\h:\w$ '
# 或者echo "PS1='\u@\h:\w$ '" >> /etc/profile
# 执行
source /etc/profile
# 或者
reboot
问题
1.编译好文件系统后发现登录不上去

显示 /bin/bash这是没有找到bash程序,而我没有印象设置过这个(其实是有的,只是当时没细看,在下图这个地方设置的)


好在 buildroot有搜索功能(和 vim里面一样),发现其实 menuconfig里面是有bash的,所以没有放弃
在修改了各种 .config\.in 后仔细看了下选项然后发现了下图红色箭头这里,然后想到应该是给隐藏了,于是开启了它以后,在去到 Shell and utilities发现有了bash。同时也要记得回到 System configuration选择shell为bash.


2. 修改网卡IP
解压生成的rootfs.tar,然后 vim ./etc/network/interfaces
添加如下内容
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
3.fakeroot错误
fakeroot: preload library `libfakeroot.so' not found, aborting.
错误原因是移动了位置导致得,然后我重新 sudo make clean。然后再次 sudo make 就可以了。
4. openCV错误
因为指定了opencv4.1.2。但是编译的时候出现一些奇怪的错误,具体没有了记录,总的来说就是一些gcc的命令没有,例如:
‘--param=ipcp-unit-growth=100000’; did you mean ‘--param=ipa-cp-unit-growth=’?
然后我重新换个高版本的openCV就行了。
更新
还是换成了指定版本的openCV,错误还是上面那个,然后修改他。使用 grep -r "ipcp-unit-growth ."去搜可以看到在两个 .make文件中有使用然后我替换完再编译就没有问题
替换命令
:%s/ipcp-unit-growth/ipa-cp-unit-growth
5. QT官方库
https://download.qt.io/archive/qt/
6. QT某些版本出现C++11的一些错误
在对应的文件添加 #include <limits>
7.生成出来的根文件系统烧写进去后没有空间

这是使用我的一个脚本生成出来的一个 .img,但是 /dev/root/没有空间了,所以需要按照如下的步骤来

然后再运行 df -h 就能够扩容rootfs了
我编译的脚本如下
#!/bin/bash
sudo rm -rf rootfs
mkdir rootfs
sudo rm linuxroot.img
dd if=/dev/zero of=linuxroot.img bs=1M count=4000
mkfs.ext3 linuxroot.img
sudo mount linuxroot.img rootfs/
sudo cp -rfp buildroot-2023.11/output/images/rootfs.tar rootfs/
cd rootfs
sudo tar -xf rootfs.tar
sudo rm -rf rootfs.tar
# cDraw add
echo "start copy myself file to rootfs"
sudo cp ../my-file-rootfs/rc.local ./etc/
sudo chmod 0775 ./etc/rc.local
sudo cp ../my-file-rootfs/inittab ./etc/
sudo cp ../my-file-rootfs/profile ./etc/
sudo cp ../my-file-rootfs/interfaces ./etc/network/
echo "finish copy file to rootfs"
#end
sync
sync
cd ..
sudo umount rootfs
e2fsck -p -f linuxroot.img
resize2fs -M linuxroot.img
sync
sync
8. Gstream1 出现 Building documentation for gstreamer ERROR: Error in gtkdoc helper script:
这是包的gtkdoc,猜测是gstream1的文档,需要把他关到,但是,我去 package/gstream里面关掉后也无法修复这个bug。经过长时间的摸索,找到了修改的地方
buildroot/output/rockchip_rk3588/build/gstreamer1-1.16.2/meson.build里面的最后一段

屏蔽掉就ok!