You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux下CMake构建的Qt5/6项目交叉编译问题求助

Linux下CMake构建的Qt5/6项目交叉编译问题求助

各位好,我现在在Linux上尝试交叉编译一个用CMake构建的Qt项目,踩了好几个坑,想请大家帮忙看看问题出在哪。

我先梳理下已经尝试过的操作和对应的报错:

  1. 尝试用MXE的qmake构建
    我了解到MXE可以用来做Qt的交叉编译,先编译了qtbase qt6 qt5这几个包,但发现项目里没有.pro文件,只有CMakeLists.txt,所以用<mxe root>/usr/x86_64-w64-mingw32.shared/qt5/bin/qmake && make完全没有效果。

  2. 指定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'
    
  3. 使用系统自带的交叉编译器
    换成系统自带的/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项目经验的同学能给点思路,谢谢大家!

火山引擎 最新活动