Qt自身有qmake工具,对于一些规模较小的qt工程而言,用qmake来构建工程确实很方便,但随着工程复杂度的增加或者当所开发的工程依赖于其他函数库时,使用CMake来管理工程会是一个明智的选择。
Qt的编译系统
Qt4示例
用Cmake来管理Qt工程
# cmake版本CMAKE_MINIMUM_REQUIRED(VERSION 2.8)# 工程的名字PROJECT(YourProjectName)# 找Qt相关包,而且是必须找到FIND_PACKAGE(Qt4 REQUIRED)INCLUDE(${QT_USE_FILE})# 定义变量Project_SRCS,其值为所列的文件列表,包含程序所有源文件set(Project_SRCSmain.cpp)# 定义变量Project_UIS,其值为所列的文件列表,包含程序所有的UI文件set(Project_UISYourQtWindows.ui)# 定义变量Project_MOC_HDRS,其值为所列的文件列表,包含所有含有Q_OBJECT的头文件set(Project_MOC_HDRSYourQtProjectFiles.h)# qt4_wrap_ui通过Qt的uic.exe生成UI文件对应的ui_xxxx.h文件# 并将生成的ui_xxxx.h文件列表存储于变量Project_UIS_H中qt4_wrap_ui(Project_UIS_H ${Project_UIS})# qt4_wrap_cpp通过Qt的moc.exe将包含Q_OBJECT的头文件生成对应的moc_xxx.cxx文件,# 并将生成的moc_xxx.cxx文件列表存储在变量Project_MOC_SRCS里qt4_wrap_cpp(Project_MOC_SRCS ${Project_MOC_HDRS})# Qt的MOC和UIC程序生成的moc_xxx.cxx和ui_xxx.h等文件是存放在CMake的"Where build the binaries"里指定的目录里,所以必须将这些路径包含进来include_directories(${Project_SOURCE_DIR}${CMAKE_CURRENT_BINARY_DIR})# Qt程序如果有资源文件(*.qrc),要包含资源文件# qt4_add_resources用qt的rcc.exe生成相应的qrc_xxx.cpp文件# 并将生成的文件列表存储于变量Project_RCC_SRCS里set(Project_RCCS YourProject.qrc)qt4_add_resources(Project_RCC_SRCS ${Project_RCCS})# 根据程序的cpp文件、头文件以及生成的ui_xxx.h、moc_xxx.cxx、qrc_xxx.cxx# 等生成可执行文件,并链接Qt的动态库(Qt的动态库都定义在QT_LIBRARIES变量里了)add_executable(YourProjectName${Project_SRCS}${Project_UIS_H}${Project_MOC_SRCS}${Project_RCC_SRCS})target_line_libraries(YourProjectName${QT_LIBRARIES})
Qt5
示例一
cmake_minimum_required(VERSION 2.8)project ( cmake_compile_qt_project )set(PROJECT_NAME cmake_compile_qt_project_test)# declaring files in your projectset ( SOURCESmain.cppmainwindow.cpp)set ( MOC_HEADERSmainwindow.h)set ( UISmainwindow.ui)# set ( RESOURCES# main.qrc# )# Next lines needed for building all Qt projectsfind_package( Qt5 REQUIRED Core Gui Widgets)set(QT_PREFIX C:/Qt/Qt5.9.6/5.9.6/msvc2015_64)set(QT_USE_FILE ${QT_PREFIX}/lib/cmake/Qt5/Qt5Config.cmake)include( ${QT_USE_FILE} )add_definitions( ${QT_DEFINITIONS} )include_directories(${CMAKE_BINARY_DIR}${QT_PREFIX}/include${QT_PREFIX}/include/QtWidgets)# Next, using precompiler, compiler and linker# using Qt meta-system (precompiler)QT5_ADD_RESOURCES( RES_SOURCES ${RESOURCES} )QT5_WRAP_UI( UI_HEADERS ${UIS} )QT5_WRAP_CPP( MOC_SRCS ${MOC_HEADERS} )# Specify qt libraries pathlink_directories(${QT_PREFIX}/lib)# compileadd_executable( ${PROJECT_NAME}${SOURCES}${MOC_SRCS}${RES_SOURCES}${UI_HEADERS})# or use line below instead, if you using Windows ™ Operating System.#add_executable( PROJECT_NAME WIN32 ${SOURCES} ${MOC_SRCS} ${RES_SOURCES} ${UI_HEADERS} )# Remove the console of gui programif(WIN32)if(MSVC)set_target_properties(${PROJECT_NAME} PROPERTIESWIN32_EXECUTABLE YESLINK_FLAGS "/ENTRY:mainCRTStartup")elseif(CMAKE_COMPILER_IS_GNUCXX)# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not testedelse()message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")endif(MSVC)elseif(APPLE)set_target_properties(${PROJECT_NAME} PROPERTIESMACOSX_BUNDLE YES)elseif(UNIX)# Nothing special requiredelse()message(SEND_ERROR "You are on an unsupported platform! (Not Win32, Mac OS X or Unix)")endif(WIN32)# build it (link libraries)target_link_libraries( ${PROJECT_NAME}#${QT_LIBRARIES}Qt5CoreQt5Widgets)install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
示例二
cmake_minimum_required(VERSION 2.8)project ( cmake_compile_qt_project )set(PROJECT_NAME cmake_compile_qt_project_test)# Find includes in corresponding build directoriesset(CMAKE_INCLUDE_CURRENT_DIR ON)# Instruct CMake to run moc automatically when neededset(CMAKE_AUTOMOC ON)# Create code from a list of Qt designer ui filesset(CMAKE_AUTOUIC ON)# Find the QtWidgets libraryfind_package(Qt5Widgets CONFIG REQUIRED)# Populate a CMake variable with the sourcesset(helloworld_SRCSmainwindow.uimainwindow.cppmain.cpp)# Tell CMake to create the helloworld executableadd_executable(${PROJECT_NAME} ${helloworld_SRCS})# Remove the console of gui programif(WIN32)if(MSVC)set_target_properties(${PROJECT_NAME} PROPERTIESWIN32_EXECUTABLE YESLINK_FLAGS "/ENTRY:mainCRTStartup")elseif(CMAKE_COMPILER_IS_GNUCXX)# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not testedelse()message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")endif(MSVC)elseif(APPLE)set_target_properties(${PROJECT_NAME} PROPERTIESMACOSX_BUNDLE YES)elseif(UNIX)# Nothing special requiredelse()message(SEND_ERROR "You are on an unsupported platform! (Not Win32, Mac OS X or Unix)")endif(WIN32)# Use the Widgets module from Qt 5target_link_libraries(${PROJECT_NAME} Qt5::Widgets)
去除控制台:加WIN32
add_executable(${PROJECT_NAME} WIN32 ${Project_Sources} ${Project_Headers} ${Project_UIs} myApp.rc)
