本文共 6284 字,大约阅读时间需要 20 分钟。
项目源码目录结构清晰,包含以下主要文件和文件夹:
.├── build.sh├── businesscontrol.cpp├── businesscontrol.h├── globaldef.h├── lib│ └── x86_64├── log│ ├── LogFileManager.cpp│ ├── LogFileManager.h├── main.cpp├── mqtt│ ├── mqttclient.cpp│ ├── mqttclient.h├── demo.pro├── CMakeList.txt├── res│ ├── closea.png│ ├── closeb.png│ └── close.png├── tapplication.cpp├── tapplication.h├── util│ ├── json.cpp│ │ └── json.h└── widget ├── mainwidget.cpp ├── mainwidget.h
QMake项目配置文件(demo.pro)如下:
#-------------------------------------------------# 项目由 QtCreator 创建于 2021-01-04T09:37:29#-------------------------------------------------QT += core greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = demoTEMPLATE = appDEFINES += QT_DEPRECATED_WARNINGSDEFINES += LINUX_OS_VERSION==$$QT_ARCHDEFINES += QT_MESSAGELOGCONTEXT# 可选:禁用Qt5.6及更早版本已弃用的API# DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000message($$QT_ARCH)message($$QT_VERSION)contains(QT_ARCH, x86_64) { message("LINUX_OS_X86_64") DEFINES += LINUX_OS_X86_64} else { message("LINUX_OS_ARM64") DEFINES += LINUX_OS_ARM64}exists (../.git) { GIT_BRANCH = $$system(git rev-parse --abbrev-ref HEAD) GIT_TIME = $$system(git show --oneline --format="%ci%H" -s HEAD) APP_VERSION = "VersionInfo: $$${GIT_BRANCH} : $$${GIT_TIME}"} else { APP_VERSION = None}DEFINES += APP_VERSION=\"\\\"$$APP_VERSION\\\"\" message($$APP_VERSION)INCLUDEPATH += widgetINCLUDEPATH += logINCLUDEPATH += mqttINCLUDEPATH += utilSOURCES += main.cppSOURCES += tapplication.cppSOURCES += log/LogFileManager.cppSOURCES += widget/mainwidget.cppSOURCES += mqtt/mqttclient.cppSOURCES += util/json.cppSOURCES += businesscontrol.cppHEADERS += tapplication.hHEADERS += widget/mainwidget.hHEADERS += log/LogFileManager.hHEADERS += globaldef.hHEADERS += mqtt/mqttclient.hHEADERS += util/json.hHEADERS += businesscontrol.hFORMS += widget/toolbar.ui# 常用编译选项QMAKE_CC += -gQMAKE_CXX += -gQMAKE_LINK += -gmessage($$PWD)message($$QT_SYSROOT)INCLUDEPATH += $$QT_SYSROOT/usr/local/include/****LIBS += -lpaho-mqtt3aDISTFILES +=
CMake项目文件(CMakeList.txt)如下:
cmake_minimum_required(VERSION 3.5)project(demo LANGUAGES CXX)# 项目名称及语言set(CMAKE_INCLUDE_CURRENT_DIR ON)# 当前目录包含目标文件set(CMAKE_AUTOUIC ON) # UI 支持set(CMAKE_AUTOMOC ON) # MOC 支持set(CMAKE_AUTORCC ON) # 资源文件支持set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED ON)if(ANDROID) { set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") if (ANDROID_ABI STREQUAL "armeabi-v7a") { set(ANDROID_EXTRA_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so) endif()endif()set(QT_MESSAGELOGCONTEXT TRUE)add_definitions(-DQT_MESSAGELOGCONTEXT)# Git 版本信息set(GIT_COMMIT_HASH "")set(GIT_BRANCH_NAME "")find_package(Git QUIET)if(GIT_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%ci%H OUTPUT_VARIABLE GIT_COMMIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) execute_process( COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD OUTPUT_VARIABLE GIT_BRANCH_NAME OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )endif()set(APP_VERSION "VersionInfo: ${GIT_BRANCH_NAME}:${GIT_COMMIT_HASH}")message(STATUS ${APP_VERSION})configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ver.h.ini ${CMAKE_BINARY_DIR}/ver.h @ONLY)# 系统信息打印message(STATUS "cmake-version: ${CMAKE_VERSION}")message(STATUS "system_name: ${CMAKE_HOST_SYSTEM_NAME}")message(STATUS "system_version: ${CMAKE_HOST_SYSTEM_PROCESSOR}")message(STATUS "system_kernel: ${CMAKE_HOST_SYSTEM_VERSION}")if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64") { message(STATUS "LINUX_OS_X86_64") set(LINUX_OS_X86_64 TRUE) add_definitions(-DLINUX_OS_X86_64)} elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "AARCH64") { message(STATUS "LINUX_OS_ARM64") set(LINUX_OS_ARM64 TRUE) add_definitions(-DLINUX_OS_ARM64)endif()include_directories(${CMAKE_CURRENT_SOURCE_DIR}/widget ${CMAKE_CURRENT_SOURCE_DIR}/log ${CMAKE_CURRENT_SOURCE_DIR}/mqtt ${CMAKE_CURRENT_SOURCE_DIR}/util)include_directories(/usr/local/include/****)find_package(Qt NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} PROJECT_SOURCES)aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/widget WIDGET_SOURCES)aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/mqtt MQTT_SOURCES)aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/util UTIL_SOURCES)aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/log LOG_SOURCES)set(PROJECT_LIBS paho-mqtt3a)if(${QT_VERSION_MAJOR} >= 6) { qt_add_executable(demo ${PROJECT_SOURCES} ${WIDGET_SOURCES} ${MQTT_SOURCES} ${LOG_SOURCES} ${UTIL_SOURCES} ${SPICEUSB_SOURCES} )} else() { if(ANDROID) { add_library(demo SHARED ${PROJECT_SOURCES} ${WIDGET_SOURCES} ${MQTT_SOURCES} ${LOG_SOURCES} ${UTIL_SOURCES} ${SPICEUSB_SOURCES} ) } else() { add_executable(demo ${PROJECT_SOURCES} ${WIDGET_SOURCES} ${MQTT_SOURCES} ${LOG_SOURCES} ${UTIL_SOURCES} ${SPICEUSB_SOURCES} ) }endif()target_link_libraries(demo PRIVATE Qt${QT_VERSION_MAJOR}::Widgets ${PROJECT_LIBS})
QMake 语法 | CMake 语法 | 备注 |
---|---|---|
QT += core | find_package(Qt NAMES Qt6 Qt5 ...) | 依赖 Qt 的版本和组件 |
greaterThan(QT_MAJOR_VERSION, 4) | - 无直接对应 | 版本检查 |
TARGET = demo | project(demo LANGUAGES CXX) | 项目名称及语言 |
TEMPLATE = app | - 无直接对应 | 主要模块类型 |
DEFINES += ... | add_definitions(...) | 预处理符号定义 |
INCLUDEPATH += ... | include_directories(...) | 访问头文件路径 |
SOURCES += ... | aux_source_directory(...) | 源文件路径 |
HEADERS += ... | - 无直接对应 | 头文件路径 |
Forms += ... | - 无直接对应 | UI 文件路径 |
QMAKE_CC += -g | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") | 编译选项 -g |
SUSINESS选项 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") | C++ 编译选项 -g |
message(... | message("...") | thông báo信息 |
exists(... | execute_process(...) | 执行 shell 命令 |
以上内容适用于 Qt6.0 及更高版本的 CMake 项目生成,默认包含了现代化编译选项和依赖管理功能。
转载地址:http://nslkk.baihongyu.com/