1

Biên dịch chéo Qt cho Raspberry Pi

Biên dịch chéo Qt cho Raspberry Pi

Qt Creator là một trường lập trình (IDE) cực kì phổ biến cho những người lập trình nhúng, giúp tạo và triển khai ứng dụng một cách nhanh chóng, nó có sẵn trên nhiều nền tảng như Linux, Windows và macOS.

Qt 5.12 là bản phát hành được sử dụng phổ biến của Qt framework. Bài viết này sẽ hướng dẫn bạn:

  • Cài đặt môi trường biên dịch chéo Qt trên PC và Raspberry Pi (Qt 5.12.5)
  • Cấu hình Qt Creator biên dịch chéo trên PC

Phần cứng:

Yêu cầu:

  • Raspberry Pi đã cài đặt OS (tham khảo cách cài đặt).
  • Cập nhật firmware cho Pi.
    • sudo rpi-update
    • reboot
  • Bật ssh cho Pi.
    • sudo raspi-config
    • Interfacing Options
    • ssh

Cài đặt môi trường biên dịch chéo Qt cho Raspberry Pi

Cài đặt thư viện – Pi

Chúng ta cần cài đặt một số thư viện phát triển trước tiên vì vậy bạn phải cho phép hệ thống cài đặt deb-src. Bằng cách bỏ comment deb-src trong /etc/apt/sources.list.

sudo nano /etc/apt/sources.list

Tiếp theo chúng ta cập nhật và cài đặt các gói sau:

sudo apt-get update
sudo apt-get build-dep qt4-x11
sudo apt-get build-dep libqt5gui5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0

Tạo thư mục đích – Pi

Bước này chúng ta chỉ tạo một thư mục trên Raspberry Pi. Thư mục này (/usr/local/qt5pi) dùng để cài đặt phiên bản Qt được PC biên dich sau này.

sudo mkdir /usr/local/qt5pi
sudo chown pi:pi /usr/local/qt5pi

Download và cài đặt toolchain – PC

mkdir ~/raspi
cd ~/raspi
git clone https://github.com/raspberrypi/tools

Cấu hình và đồng bộ sysroot – PC

sysroot là một thư mục cha, bao gồm tất cả các thư mục con cần cho một hệ thống chạy. Chúng ta tạo một sysroot cho Pi để biên dịch chéo trên PC.

mkdir sysroot sysroot/usr sysroot/opt

Chúng ta dùng lệnh rsync để đồng bộ thư mục giữa Pi và PC, nếu có sự thay đổi trên PC chúng có thể dễ dàng truyền tải xuống Pi. Bạn có thể thay thế raspberrypi.local thành địa chỉ IP của Pi.

rsync -avz pi@raspberrypi.local:/lib sysroot
rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt

Tiếp theo chúng ta cần điều chỉnh các symbolic links trong sysroot để tương thích trên PC.

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

Download một phiên bản Qt – PC

Download và cài đặt phiên bản Qt 5.12.5.

wget http://download.qt.io/official_releases/qt/5.12/5.12.5/single/ qt-everywhere-src-5.12.5.tar.xz
tar xvf  qt-everywhere-src-5.12.5.tar.xz
cd  qt-everywhere-src-5.12.5

Cấu hình phiên bản Qt cho biên dịch chéo – PC

Trong phiên bản Raspberry Pi OS mới, thư viên EGL có tên khác với tên giả định trong file cấu hình, vì vậy chúng ta cần chỉnh sửa file ./qtbase/mkspecs/devices/linux-rasp-pi-g++/qmake.conf, thay thế tham chiếu -lEGL và -LGLESv2 thành -lbrcmEGL và -lbrcmGLESv2 tương ứng.

Thư mục linux-rasp-pi3-g++ (Qt 5.12) hoặc linux-rasp-pi-g++ ( từ Qt 5.12.2 tới Qt 5.12.5) được áp dụng cho phiên bản Raspberry Pi 3.

VersionConfigure optionArchitectureRemarks
  Raspberry Pi 3
  (not working for 
  Qt 5.12.2 to 5.12.5)
-device linux-rpi3-g++ARM V8QtScript build fails
-skip qtscript needed
  Raspberry Pi 2-device linux-rpi2-g++ARM V7
  Raspberry Pi 1
  Raspberry Pi Zero
-device linux-rpi-g++ARM V6

Cũng có một cách khác để sửa điều này, bạn có thể tham khảo tại đây.

Chú ý: Câu lệnh sau được đã bỏ qua biên dịch các module qtwaylandqtlocation và qtscript vì không sử dụng.

./configure -release -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -skip qtwayland -skip qtlocation -skip qtscript -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -no-use-gold-linker -v -no-gbm

Khi cấu hình thành công, bạn sẽ thấy tương tự như sau:

Build options:
......
QPA backends:
  ......
  EGLFS .................................. yes
  EGLFS details:
    ......
    EGLFS Raspberry Pi ................... yes
    ......

Biên dịch và cài đặt phiên bản Qt lên thư mục đích – Pi

Biên dịch sẽ mất rất nhiều thời gian tùy cấu hình PC của bạn, nên sử dụng biên dịch song song với cờ j, với j là số thread.

make -j4
make install

Sau khi biên dịch xong,chúng ta đồng bộ thư mục đích với Pi.

rsync -avz qt5pi pi@raspberrypi.local:/usr/local

Cấu hình Qt Creator biên dịch chéo cho Raspberry Pi

Bạn cần cài đặt Qt Creator trước để thực hiện tiếp bước này. Download và cài đặt tại đây.

Cấu hình Device mới cho QtCreator. Tools -> Options, Devices – >Add -> Generic Linux Device.

Add device

Sau đó cài đặt Name (Raspberry Pi), IP address (raspberrypi.local), Username (pi), Password (******).

Configure device

Tiếp theo, chọn Kits -> Compilers -> Add -> GCC, chọn đường dẫn GCC tới: ~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/bin/gcc

QtCreator select GCC

Add -> G++, chọn đường dẫn G++ tới: ~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/bin/g++

QtCreator select G++

Chọn Kits -> Debugers -> Add , chọn đường dẫn tới: ~/raspi/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb

QtCreator select GDB

Chọn Kits -> Qt Versions -> Add, chọn đường dẫn tới: ~/raspi/qt5/bin/qmake

QtCreator select QMake

Cuối cùng cấu hình Kits, Kits -> Kits -> Add.

  • Device type: Generic Linux Device
  • Device: Raspberry Pi (defaut for Generic Linux)
  • Sysroot: ~/raspi/sysroot
  • Compiler C: GCC (rpi)
  • Compiler C++: GCC (rpi)
  • Debugger: GDB (rpi)
  • Qt version: Qt 5.12.5 (qt5)(rpi)

Hoàn thành cấu hình QtCreator bạn có thể tạo một dự án mới hoặc chạy thử với một Example. Ở đây chúng ta chay thử với Digital Clock Example.

Biên dịch

Build project

Chạy project trên Pi

Run project

Một số lỗi có thể gặp

Lỗi hiển thị:

Unable to query physical screen size, defaulting to 100 dpi.
To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).

Cách sửa:

rm /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
ln -s /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2

Tham khảo thêm các lỗi:

Chúc các bạn thành công!

thanhbinh89

One Comment

Trả lời

Email của bạn sẽ không được hiển thị công khai.