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_SRCS
main.cpp
)
# 定义变量Project_UIS,其值为所列的文件列表,包含程序所有的UI文件
set(Project_UIS
YourQtWindows.ui
)
# 定义变量Project_MOC_HDRS,其值为所列的文件列表,包含所有含有Q_OBJECT的头文件
set(Project_MOC_HDRS
YourQtProjectFiles.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 project
set ( SOURCES
main.cpp
mainwindow.cpp
)
set ( MOC_HEADERS
mainwindow.h
)
set ( UIS
mainwindow.ui
)
# set ( RESOURCES
# main.qrc
# )
# Next lines needed for building all Qt projects
find_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 path
link_directories(${QT_PREFIX}/lib)
# compile
add_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 program
if(WIN32)
if(MSVC)
set_target_properties(${PROJECT_NAME} PROPERTIES
WIN32_EXECUTABLE YES
LINK_FLAGS "/ENTRY:mainCRTStartup"
)
elseif(CMAKE_COMPILER_IS_GNUCXX)
# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested
else()
message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")
endif(MSVC)
elseif(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE YES
)
elseif(UNIX)
# Nothing special required
else()
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}
Qt5Core
Qt5Widgets
)
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 directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed
set(CMAKE_AUTOMOC ON)
# Create code from a list of Qt designer ui files
set(CMAKE_AUTOUIC ON)
# Find the QtWidgets library
find_package(Qt5Widgets CONFIG REQUIRED)
# Populate a CMake variable with the sources
set(helloworld_SRCS
mainwindow.ui
mainwindow.cpp
main.cpp
)
# Tell CMake to create the helloworld executable
add_executable(${PROJECT_NAME} ${helloworld_SRCS})
# Remove the console of gui program
if(WIN32)
if(MSVC)
set_target_properties(${PROJECT_NAME} PROPERTIES
WIN32_EXECUTABLE YES
LINK_FLAGS "/ENTRY:mainCRTStartup"
)
elseif(CMAKE_COMPILER_IS_GNUCXX)
# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested
else()
message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")
endif(MSVC)
elseif(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE YES
)
elseif(UNIX)
# Nothing special required
else()
message(SEND_ERROR "You are on an unsupported platform! (Not Win32, Mac OS X or Unix)")
endif(WIN32)
# Use the Widgets module from Qt 5
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)
去除控制台:加WIN32
add_executable(${PROJECT_NAME} WIN32 ${Project_Sources} ${Project_Headers} ${Project_UIs} myApp.rc)