Buildroot定制文件系统

一、下载buildroot

buildroot官方下载链接

下载完成后解压到一个目录使用 tar -xvf buildroot***

二、开始选配

很多东西buildroot都包含了,但是不包含 gcc,在我尝试本地交叉编译gcc后放弃了,各种错误。

怎么去选择呢,再buildroot的目录执行 make menuconfig进入到一个界面(和内核选配界面一样的)

  1. 芯片架构

    去网上找你对应芯片的具体信息,如芯片架构、核心配置

    如我的3588,我就选择armV8/A76-A55

  2. 交叉编译的工具链主要选择gcc的版本

    也把 enable C++ support选上吧

  3. 编译选项也没有设置

  4. 系统配置

    主要设置一些欢迎语、用户名、密码啥的

  5. kenel(不编译不管)

  6. 目标板的程序包(包含库、应用程序等,主要就是他)

    1. 里面东西很多,慢慢翻吧,善用 /搜索
  7. 文件系统设置

    主要设置buildroot通过什么方式给你生成的东西

  8. bootloaders配置(不编译不管)

  9. 下面两个都没有选(我没有用上)

三、🚨添加组件

rockchip

由于我的目标板是RK3588,所以我需要一些rockchip特有的库,于是我从SDK里面提取了 rockchip的东西到我下载的buildrooot里面,如果需要可以去 电子资源里下载

下载解压后在 ./buildroot/package/Config.in添加这句话 source "package/rockchip/Config.in"

image-jfom.png

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

image-mxzl.png

以满足上图的RKNPU2_SITE

opencv & opencv_contrib

opencv就不说了,勾选上opencv3就ok了。

重点说下opencv_contrib如何编译到opencv中

需要去改opencv3.mk 路径 package/opencv3/opencv3.mk

image-pyhn.png

主要就这几个,注意路径。其他就不用设置了,他就可以编译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的位置,这里面就是包含了头文件,库等

如何可以正常编译成功,这时候拷贝到使用这个文件系统的板子上,运行,如果可以运行就说明没问题。

怎么烧写文件系统就不描述了。有问题可以评论区留言

问题

  • 某些文件下载很慢

image-xeef.png

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

  • 编译错误1

    image-qwum.png

    替换 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.编译好文件系统后发现登录不上去

image-bxje.png

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

image-mpeq.png

2ec8e618e73d09617d16a0cf3c41606.png

好在 buildroot有搜索功能(和 vim里面一样),发现其实 menuconfig里面是有bash的,所以没有放弃

在修改了各种 .config\.in 后仔细看了下选项然后发现了下图红色箭头这里,然后想到应该是给隐藏了,于是开启了它以后,在去到 Shell and utilities发现有了bash。同时也要记得回到 System configuration选择shell为bash.

image-syan.png

image-lehg.png

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.生成出来的根文件系统烧写进去后没有空间

image-kygm.png

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

image-rxdc.png

然后再运行 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里面的最后一段

image-lqro.png

屏蔽掉就ok!