Linux下CMake构建的Qt5/6项目交叉编译问题求助
Linux下CMake构建的Qt5/6项目交叉编译问题求助
各位好,我现在在Linux上尝试交叉编译一个用CMake构建的Qt项目,踩了好几个坑,想请大家帮忙看看问题出在哪。
我先梳理下已经尝试过的操作和对应的报错:
尝试用MXE的qmake构建
我了解到MXE可以用来做Qt的交叉编译,先编译了qtbase qt6 qt5这几个包,但发现项目里没有.pro文件,只有CMakeLists.txt,所以用<mxe root>/usr/x86_64-w64-mingw32.shared/qt5/bin/qmake && make完全没有效果。指定MXE自带的静态交叉编译器
我直接在CMake里配置MXE的静态编译器:set(CMAKE_C_COMPILER /opt/mxe/usr/bin/i686-w64-mingw32.static-gcc) set(CMAKE_CXX_COMPILER /opt/mxe/usr/bin/i686-w64-mingw32.static-g++)结果编译时直接报错:
i686-w64-mingw32.static-g++: error: unrecognized command-line option '-mno-direct-extern-access'使用系统自带的交叉编译器
换成系统自带的/usr/bin/x86_64-w64-mingw32-c和/usr/bin/x86_64-w64-mingw32-c++后,先遇到了头文件找不到的错误:/usr/include/qt6/QtGui/qwindowdefs.h:56:12: fatal error: QtGui/qwindowdefs_win.h: No such file or directory后来我加了
include_directories(/usr/include/qt)解决了这个头文件问题,但又碰到新的版本检查错误:/usr/include/qt6/QtCore/qtversionchecks.h:38:4: error: #error Qt major version not 6 or 7 38 | # error Qt major version not 6 or 7
下面是我当前使用的CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.16) project(cross_qt) set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_C_COMPILER /usr/bin/x86_64-w64-mingw32-c) set(CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-c++) include_directories(/usr/include/qt) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Svg) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS SvgWidgets) set(PROJECT_SOURCES src/main.cpp src/mainwindow.cpp src/mainwindow.ui src/mainwindow.hpp ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_executable(cross_qt MANUAL_FINALIZATION ${PROJECT_SOURCES} ) endif() target_link_libraries(cross_qt PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) target_link_libraries(cross_qt PRIVATE Qt${QT_VERSION_MAJOR}::Svg) target_link_libraries(cross_qt PRIVATE Qt${QT_VERSION_MAJOR}::SvgWidgets) include(GNUInstallDirs) install(TARGETS cross_qt BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) if(QT_VERSION_MAJOR EQUAL 6) qt_finalize_executable(cross_qt) endif()
现在卡在这个Qt版本检查的报错上,不确定是编译器和Qt版本不兼容,还是CMake的配置逻辑有问题,希望有交叉编译Qt项目经验的同学能给点思路,谢谢大家!




