# cmake-qt-cross **Repository Path**: wolfism/cmake-qt-cross ## Basic Information - **Project Name**: cmake-qt-cross - **Description**: CMake进行Qt交叉编译示例 - **Primary Language**: C++ - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-25 - **Last Updated**: 2026-03-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: Qt ## README # Qt CMake 交叉编译 这是一个使用CMake进行Qt交叉编译的示例项目,支持在宿主机上编译并部署到目标设备上运行。 项目演示了如何通过CMake配置实现对AArch64架构的目标设备进行交叉编译。 ## 项目简介 此示例项目是一个简单的Qt应用程序,包含一个带有图片显示的主窗口。 可以在两种环境下编译: - **宿主机环境** 本地交叉编译后部署到AArch64架构的目标设备上运行 ```bash mkdir build; cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-aarch64.cmake; make ``` - **目标设备环境** 目标设备直接编译 ```bash mkdir build;cd build; cmake ..; make ``` ## 交叉编译 交叉编译是指在一个平台上编译出能在另一个平台上运行的程序代码。 例如,在x86架构的PC上编译出能在AArch64架构的嵌入式设备上运行的程序。 **CMake工具链文件 ([toolchain-aarch64.cmake](./toolchain-aarch64.cmake))** - [CMAKE_FIND_ROOT_PATH_MODE_INCLUDE]设置为ONLY模式,确保链接器只查找目标平台头文件 - [CMAKE_FIND_ROOT_PATH_MODE_LIBRARY]设置为ONLY模式,确保链接器只查找目标平台的库 - [CMAKE_FIND_ROOT_PATH_MODE_PROGRAM]设置为NEVER,确保使用宿主机的Qt工具 **设置Qt工具路径** ``` # 使用主机上安装的Qt工具,安装 sudo apt install qtbase5-dev-tools set(QT_TOOL_PATH /usr/lib/qt5/bin) # 使用交叉编译主机Qt工具路径,提前编译好qtbase5-dev-tools #set(QT_TOOL_PATH CrossQTPATH/bin) # Qt5CoreConfigExtras.cmake if (NOT TARGET Qt5::qmake) add_executable(Qt5::qmake IMPORTED) set_target_properties(Qt5::qmake PROPERTIES IMPORTED_LOCATION "") endif() if(NOT TARGET Qt5::moc) add_executable(Qt5::moc IMPORTED) set_target_properties(Qt5::moc PROPERTIES IMPORTED_LOCATION ${QT_TOOL_PATH}/moc) endif() if(NOT TARGET Qt5::rcc) add_executable(Qt5::rcc IMPORTED) set_target_properties(Qt5::rcc PROPERTIES IMPORTED_LOCATION ${QT_TOOL_PATH}/rcc) endif() # Qt5WidgetsConfigExtras.cmake if(NOT TARGET Qt5::uic) add_executable(Qt5::uic IMPORTED) set_target_properties(Qt5::uic PROPERTIES IMPORTED_LOCATION ${QT_TOOL_PATH}/uic) endif() ``` ## 应用场景 - 嵌入式Linux设备开发 - ARM架构的IoT设备开发 - 资源受限的目标平台开发 - 需要在桌面端快速开发并在嵌入式设备上运行的应用 ## 编译日志 ``` $ cd PROJECT_PATH && rm -rf build && mkdir build && cd build && cmake --toolchain ../toolchain-aarch64.cmake .. && make && file ../bin/qt-win -- QT_TOOL_PATH: /usr/lib/qt5/bin -- The CXX compiler identification is GNU 11.4.0 -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Found SOURCES: /mnt/g/dev/cmake-qt-cross/main.cpp;/mnt/g/dev/cmake-qt-cross/mainwindow.cpp -- Found HEADERS: /mnt/g/dev/cmake-qt-cross/mainwindow.h -- Configuring done -- Generating done -- Build files have been written to: /mnt/g/dev/cmake-qt-cross/build [ 14%] Automatic MOC and UIC for target qt-win [ 14%] Built target qt-win_autogen [ 28%] Automatic RCC for qt-win.qrc [ 42%] Building CXX object CMakeFiles/qt-win.dir/qt-win_autogen/mocs_compilation.cpp.o [ 57%] Building CXX object CMakeFiles/qt-win.dir/main.cpp.o [ 71%] Building CXX object CMakeFiles/qt-win.dir/mainwindow.cpp.o [ 85%] Building CXX object CMakeFiles/qt-win.dir/qt-win_autogen/EWIEGA46WW/qrc_qt-win.cpp.o [100%] Linking CXX executable ../bin/qt-win [100%] Built target qt-win ../bin/qt-win: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=92a9fe4ef68d5dbf98cecd0e493a1eb3347c9493, for GNU/Linux 3.7.0, not stripped ``` ## 注意事项 1. 确保系统中安装了AArch64交叉编译工具链aarch64-linux-gnu-gcc 2. 确保sysroot中有目标平台的Qt库文件 3. 确保有宿主机上的Qt工具(moc, uic, rcc等) ## 运行示例 ![Qt Cross-Compilation Example](screenshot.png)