cmake中编译QT程序方法

发布于:2024-07-31 ⋅ 阅读:(143) ⋅ 点赞:(0)
cmake_minimum_required(VERSION 3.27)
project(HuaRongTrail)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(CMAKE_PREFIX_PATH "C:/Qt/6.7.0/msvc2019_64")

find_package(Qt6 COMPONENTS
        Core
        Gui
        Widgets
        REQUIRED)

file(GLOB_RECURSE src "code/src/*.cpp")
file(GLOB_RECURSE inc "code/inc/*.h")
file(GLOB_RECURSE ui "res/*.ui")
file(GLOB_RECURSE rc "res/*.rc" "res/*.qrc")

set(CMAKE_AUTOUIC_SEARCH_PATHS "res")

add_executable(HuaRongTrail
        ${src}
        ${inc}
       # ${ui}
        ${rc}
)

target_link_libraries(HuaRongTrail
        Qt::Core
        Qt::Gui
        Qt::Widgets
)

target_include_directories(HuaRongTrail PRIVATE "code/inc")

if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(DEBUG_SUFFIX)
    if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif ()
    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()
    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
    endif ()
    foreach (QT_LIB Core Gui Widgets)
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/bin/Qt6${QT_LIB}${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
    endforeach (QT_LIB)
endif ()

要注意的点

  • CMAKE_PREFIX_PATH 需要设置QT的路径
  • 在add_executable时,需要把头文件也包含进来, ui文件可以不包含进来,cmake会自动在源代码中找引用的ui_<name>.h的格式,然后去找<name>.ui文件
  • <name>.ui文件会在当前源代码附近,或者在CMAKE_AUTOUIC_SEARCH_PATHS 指定的路径下寻找
  • 不要用include_directories而要用target_include_directories,前者是cmake设置,后者是用户设置
  • CMakeLists.txt其余是CLion自动生成,主要工作时把QT相关的dll放到生成目录中
  • 运行可执行程序,可能会出现命令行窗口,在main文件中添加
  • 资源文件要放到add_executable中
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )

程序结构为:
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到