本文简单研究了Qt生成的默认的CMakeLists.txt。理解之后便可以较为合理地设计自己的Qt程序。
Qt的典型CMakeLists.txt
的逐段解析如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| cmake_minimum_required(VERSION 3.5)
project(untitled VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)、
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h mainwindow.ui )
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_executable(untitled MANUAL_FINALIZATION ${PROJECT_SOURCES} )
else() if(ANDROID) add_library(untitled SHARED ${PROJECT_SOURCES} )
else() add_executable(untitled ${PROJECT_SOURCES} ) endif() endif()
target_link_libraries(untitled PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
set_target_properties(untitled PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE )
if(QT_VERSION_MAJOR EQUAL 6) qt_finalize_executable(untitled) endif()
|
Qt6带来的变化
文中体现出来的变化主要在于qt_add_executable
和qt_finalize_target
.
qt_add_executable
的工作是为目标平台构建一个适当的目标、将目标链接到Qt::Core
库和处理CMake目标构建完成后的结束动作(finalization)。
qt_finalize_target
是和上一个指令配合使用的,如果定义了MANUAL_FINALIZATION
,需要在合适的地方手动进行结束动作。
其中为了多平台,qt_add_executable
主要的区别在于:
- Android平台上,只创建
MODULE
库,忽略任何 WIN32
或 MACOSX_BUNDLE
选项,接受Android的特性选项。
- 其他平台上,创建一个可执行目标。
qt_finalize_target
的主要区别在于:
- Android,创建一个部署环境,创建APK打包。
- WASM,创建
${target}.html,qtloader.js,qtlogo.svg
文件。
- iOS,补全没有设置的属性,比如
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM
,MACOSX_BUNDLE_GUI_IDENTIFIER
之类的。
当然这里的简单介绍跟没说一样。自己进行相应的程序构建之后才能理解为什么需要新的特性。
几个值得一看的文档如下。
qt_add_executable
qt_finalize_target
qt_add_executable
其他
关于三个AUTO工具其实也有很多学问,可以参考文章如下。
AUTOUIC - CMake 3.24.0 Documentation
AUTOMOC - CMake 3.24.0 Documentation
AUTORCC - CMake 3.24.0 Documentation