Qt自身有qmake工具,对于一些规模较小的qt工程而言,用qmake来构建工程确实很方便,但随着工程复杂度的增加或者当所开发的工程依赖于其他函数库时,使用CMake来管理工程会是一个明智的选择。

Qt的编译系统
image.png

Qt4示例

用Cmake来管理Qt工程

  1. # cmake版本
  2. CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
  3. # 工程的名字
  4. PROJECT(YourProjectName)
  5. # 找Qt相关包,而且是必须找到
  6. FIND_PACKAGE(Qt4 REQUIRED)
  7. INCLUDE(${QT_USE_FILE})
  8. # 定义变量Project_SRCS,其值为所列的文件列表,包含程序所有源文件
  9. set(Project_SRCS
  10. main.cpp
  11. )
  12. # 定义变量Project_UIS,其值为所列的文件列表,包含程序所有的UI文件
  13. set(Project_UIS
  14. YourQtWindows.ui
  15. )
  16. # 定义变量Project_MOC_HDRS,其值为所列的文件列表,包含所有含有Q_OBJECT的头文件
  17. set(Project_MOC_HDRS
  18. YourQtProjectFiles.h
  19. )
  20. # qt4_wrap_ui通过Qt的uic.exe生成UI文件对应的ui_xxxx.h文件
  21. # 并将生成的ui_xxxx.h文件列表存储于变量Project_UIS_H中
  22. qt4_wrap_ui(Project_UIS_H ${Project_UIS})
  23. # qt4_wrap_cpp通过Qt的moc.exe将包含Q_OBJECT的头文件生成对应的moc_xxx.cxx文件,
  24. # 并将生成的moc_xxx.cxx文件列表存储在变量Project_MOC_SRCS里
  25. qt4_wrap_cpp(Project_MOC_SRCS ${Project_MOC_HDRS})
  26. # Qt的MOC和UIC程序生成的moc_xxx.cxx和ui_xxx.h等文件是存放在CMake的"Where build the binaries"里指定的目录里,所以必须将这些路径包含进来
  27. include_directories(${Project_SOURCE_DIR}
  28. ${CMAKE_CURRENT_BINARY_DIR}
  29. )
  30. # Qt程序如果有资源文件(*.qrc),要包含资源文件
  31. # qt4_add_resources用qt的rcc.exe生成相应的qrc_xxx.cpp文件
  32. # 并将生成的文件列表存储于变量Project_RCC_SRCS里
  33. set(Project_RCCS YourProject.qrc)
  34. qt4_add_resources(Project_RCC_SRCS ${Project_RCCS})
  35. # 根据程序的cpp文件、头文件以及生成的ui_xxx.h、moc_xxx.cxx、qrc_xxx.cxx
  36. # 等生成可执行文件,并链接Qt的动态库(Qt的动态库都定义在QT_LIBRARIES变量里了)
  37. add_executable(YourProjectName
  38. ${Project_SRCS}
  39. ${Project_UIS_H}
  40. ${Project_MOC_SRCS}
  41. ${Project_RCC_SRCS}
  42. )
  43. target_line_libraries(YourProjectName
  44. ${QT_LIBRARIES}
  45. )

Qt5

示例一

  1. cmake_minimum_required(VERSION 2.8)
  2. project ( cmake_compile_qt_project )
  3. set(PROJECT_NAME cmake_compile_qt_project_test)
  4. # declaring files in your project
  5. set ( SOURCES
  6. main.cpp
  7. mainwindow.cpp
  8. )
  9. set ( MOC_HEADERS
  10. mainwindow.h
  11. )
  12. set ( UIS
  13. mainwindow.ui
  14. )
  15. # set ( RESOURCES
  16. # main.qrc
  17. # )
  18. # Next lines needed for building all Qt projects
  19. find_package( Qt5 REQUIRED Core Gui Widgets)
  20. set(QT_PREFIX C:/Qt/Qt5.9.6/5.9.6/msvc2015_64)
  21. set(QT_USE_FILE ${QT_PREFIX}/lib/cmake/Qt5/Qt5Config.cmake)
  22. include( ${QT_USE_FILE} )
  23. add_definitions( ${QT_DEFINITIONS} )
  24. include_directories(
  25. ${CMAKE_BINARY_DIR}
  26. ${QT_PREFIX}/include
  27. ${QT_PREFIX}/include/QtWidgets
  28. )
  29. # Next, using precompiler, compiler and linker
  30. # using Qt meta-system (precompiler)
  31. QT5_ADD_RESOURCES( RES_SOURCES ${RESOURCES} )
  32. QT5_WRAP_UI( UI_HEADERS ${UIS} )
  33. QT5_WRAP_CPP( MOC_SRCS ${MOC_HEADERS} )
  34. # Specify qt libraries path
  35. link_directories(${QT_PREFIX}/lib)
  36. # compile
  37. add_executable( ${PROJECT_NAME}
  38. ${SOURCES}
  39. ${MOC_SRCS}
  40. ${RES_SOURCES}
  41. ${UI_HEADERS}
  42. )
  43. # or use line below instead, if you using Windows ™ Operating System.
  44. #add_executable( PROJECT_NAME WIN32 ${SOURCES} ${MOC_SRCS} ${RES_SOURCES} ${UI_HEADERS} )
  45. # Remove the console of gui program
  46. if(WIN32)
  47. if(MSVC)
  48. set_target_properties(${PROJECT_NAME} PROPERTIES
  49. WIN32_EXECUTABLE YES
  50. LINK_FLAGS "/ENTRY:mainCRTStartup"
  51. )
  52. elseif(CMAKE_COMPILER_IS_GNUCXX)
  53. # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested
  54. else()
  55. message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")
  56. endif(MSVC)
  57. elseif(APPLE)
  58. set_target_properties(${PROJECT_NAME} PROPERTIES
  59. MACOSX_BUNDLE YES
  60. )
  61. elseif(UNIX)
  62. # Nothing special required
  63. else()
  64. message(SEND_ERROR "You are on an unsupported platform! (Not Win32, Mac OS X or Unix)")
  65. endif(WIN32)
  66. # build it (link libraries)
  67. target_link_libraries( ${PROJECT_NAME}
  68. #${QT_LIBRARIES}
  69. Qt5Core
  70. Qt5Widgets
  71. )
  72. install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)

示例二

  1. cmake_minimum_required(VERSION 2.8)
  2. project ( cmake_compile_qt_project )
  3. set(PROJECT_NAME cmake_compile_qt_project_test)
  4. # Find includes in corresponding build directories
  5. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  6. # Instruct CMake to run moc automatically when needed
  7. set(CMAKE_AUTOMOC ON)
  8. # Create code from a list of Qt designer ui files
  9. set(CMAKE_AUTOUIC ON)
  10. # Find the QtWidgets library
  11. find_package(Qt5Widgets CONFIG REQUIRED)
  12. # Populate a CMake variable with the sources
  13. set(helloworld_SRCS
  14. mainwindow.ui
  15. mainwindow.cpp
  16. main.cpp
  17. )
  18. # Tell CMake to create the helloworld executable
  19. add_executable(${PROJECT_NAME} ${helloworld_SRCS})
  20. # Remove the console of gui program
  21. if(WIN32)
  22. if(MSVC)
  23. set_target_properties(${PROJECT_NAME} PROPERTIES
  24. WIN32_EXECUTABLE YES
  25. LINK_FLAGS "/ENTRY:mainCRTStartup"
  26. )
  27. elseif(CMAKE_COMPILER_IS_GNUCXX)
  28. # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested
  29. else()
  30. message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")
  31. endif(MSVC)
  32. elseif(APPLE)
  33. set_target_properties(${PROJECT_NAME} PROPERTIES
  34. MACOSX_BUNDLE YES
  35. )
  36. elseif(UNIX)
  37. # Nothing special required
  38. else()
  39. message(SEND_ERROR "You are on an unsupported platform! (Not Win32, Mac OS X or Unix)")
  40. endif(WIN32)
  41. # Use the Widgets module from Qt 5
  42. target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

去除控制台:加WIN32

  1. add_executable(${PROJECT_NAME} WIN32 ${Project_Sources} ${Project_Headers} ${Project_UIs} myApp.rc)