3 Qt程序编译

3.1 嵌入式开发板上编译Qt程序

3.1.1 板载环境搭建

基础配置(以Ubuntu 22.04开发板为例):

# 安装基础编译工具链  
sudo apt install build-essential cmake qt6-base-dev qt6-declarative-dev  
# 验证Qt版本  
qmake -v  # 输出应为Qt 6.5.0或更高LTS版本  

性能优化建议

  • 启用内存压缩:sudo systemctl enable zram-config(减少内存占用20-30%)

  • 禁用图形桌面:sudo systemctl set-default multi-user.target(释放GPU资源)

3.1.2 本地编译流程

项目构建示例

mkdir build && cd build  
cmake -DCMAKE_PREFIX_PATH=/usr/lib/aarch64-linux-gnu/cmake/Qt6 ..  
make -j$(nproc)  

企业级验证

  • 内存监控:valgrind --tool=massif ./your_app(检测内存泄漏)

  • 性能分析:perf record -g ./your_app(生成火焰图优化热点代码)


3.2 虚拟机上交叉编译(Qt5)

3.2.1 搭建交叉编译环境

工具链配置(ARMv7架构为例):

# 安装交叉编译器  
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf  
# 配置环境变量  
export CC=arm-linux-gnueabihf-gcc  
export CXX=arm-linux-gnueabihf-g++   

Qt5源码编译

./configure -prefix /opt/qt5-arm \  
    -xplatform linux-arm-gnueabi-g++ \  
    -no-opengl -nomake examples  
make -j4 && sudo make install  

关键参数解析

  • -no-opengl:禁用OpenGL加速(适配无GPU设备)

  • -nomake examples:减少60%编译时间

3.2.2 编译 Qt 程序

qmake项目配置

# your_project.pro  
TARGET = arm_app  
QT += core gui  
CONFIG += c++17  
DESTDIR = /opt/deploy  

编译命令

/opt/qt5-arm/bin/qmake  
make clean && make  

错误处理

  • GL/gl.h缺失:安装libgl1-mesa-dev并重新配置

  • undefined reference错误:检查.pro文件是否包含LIBS += -lts(触摸屏支持)

3.2.3 板卡上运行Qt程序

部署与运行

# 传输可执行文件  
scp arm_app user@board_ip:/home/user  
# 设置动态库路径  
export LD_LIBRARY_PATH=/opt/qt5-arm/lib:$LD_LIBRARY_PATH  
# 启动程序  
./arm_app -platform linuxfb  # 无X11环境运行  

3.3 虚拟机上交叉编译(Qt6)

3.3.1 获取配套开发文件

企业资源包配置

  1. 下载硬件厂商提供的SDK(如NXP的fsl-imx-x11

  2. 安装工具链:

chmod +x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt6-cortexa7hf-neon-toolchain-5.15.sh  
./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt6-cortexa7hf-neon-toolchain-5.15.sh  

路径规范/opt/fsl-imx-x11/5.15/sysroots(包含交叉编译头文件及库)

3.3.2 添加编译套件(kits)

Qt Creator配置流程

  1. 工具链设置

    • 编译器路径:/opt/fsl-imx-x11/5.15/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi-g++

    • CMake路径:/usr/bin/cmake(需3.20+版本)

  2. Qt版本绑定

    • 指定交叉编译后的Qt路径:/opt/qt6-arm/lib/cmake/Qt6

3.3.3 测试 cmake 例程

示例项目构建

# CMakeLists.txt  
cmake_minimum_required(VERSION 3.20)  
project(TestApp LANGUAGES CXX)  
find_package(Qt6 COMPONENTS Core REQUIRED)  
add_executable(test_app main.cpp)  
target_link_libraries(test_app PRIVATE Qt6::Core)  

编译验证

mkdir build && cd build  
cmake -DCMAKE_TOOLCHAIN_FILE=/opt/fsl-imx-x11/5.15/sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake ..  
make  

常见问题

  • C++标准不匹配:在CMakeLists.txt中设置set(CMAKE_CXX_STANDARD 17)

  • Qt模块未找到:检查find_package是否包含所需模块(如WidgetsQuick


3.4 企业级最佳实践

  1. 版本控制策略

    • 使用git submodule管理Qt源码版本(推荐锁定LTS版本如Qt 5.15.8/6.2.4)

    • 通过Dockerfile固化编译环境:

      FROM ubuntu:22.04  
      RUN apt install -y gcc-arm-linux-gnueabihf cmake  
      COPY qt6-arm /opt/qt6-arm  
      ENV PATH="/opt/qt6-arm/bin:$PATH"  
      
  2. 安全加固措施

    • 编译时启用PIE(Position Independent Executables):CONFIG += pie

    • 禁用调试符号:qmake CONFIG+=release(减少可执行文件体积30%)