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" )
程序结构为: