Qt扫盲-CMake 使用概述

CMake 使用概述

  • 一、概述
  • 二、创建Qt CMake 项目
  • 三、简单介绍
    • 1. 引入Qt的库
    • 2.Qt CMake 引入第三方库
    • 3. Qt CMake 项目目录
  • 四、使用案例

一、概述

CMake是一个简化跨不同平台开发项目的构建过程的工具。对C++来说其实就是生成一个文件,文件里面描述了,怎么组织这个工程,用编译器怎么编译这个项目之类的,这个CMake 本身不是一个编译器,其实就是生成一个让编译器能读懂编译流程的文件工具。让CMake自动生成构建系统,例如Makefiles和Visual Studio项目文件。CMake是一个第三方工具,有自己的文档。这里就是介绍一下在Qt 5中使用CMake 3.5 系列,反正是 CMake 3系列。

二、创建Qt CMake 项目

  1. 创建CMake 项目
    其实和 qmake 创建项目一个流程,只是在选择 build 系统的时候选择 CMake 就可以啦,这里演示的是创建一个 界面软件的流程
    Qt扫盲-CMake 使用概述_第1张图片

  2. 生成的工程目录如下
    Qt扫盲-CMake 使用概述_第2张图片

  3. CMake 的文件定位
    其实我们所谓的写CMake其实就是 编写这个 CMakeLists 文件
    Qt扫盲-CMake 使用概述_第3张图片

三、简单介绍

这里就是简单介绍一下这个 CMakeLists 的一些指令。

# 这里就是说 cmake的版本
cmake_minimum_required(VERSION 3.5)

# 这里project 就是这个项目的名称,以及使用的编程语言,项目名称但不是这个生成可执行文件的名称哈
project(ssss LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 设置 uic moc rcc 自动编译,其实就是类似qmake 一样,把Qt自己的C++特性转换为标准c++内容
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

# 支持c++ 11标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 就是找Qt 的模块
find_package(Qt5 COMPONENTS Widgets REQUIRED)

# 这里是一些安卓之类的可不管
if(ANDROID)
  add_library(TestCmakeApp SHARED
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
  )
else()
# 这里的 add_executable就是生成可执行文件,第一个是可执行文件名,后面就是源文件之类的
  add_executable(TestCmakeApp
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
  )
endif()

# 链接一些动态库,这个第一次就是可执行文件名,后面就是一些库
target_link_libraries(TestCmakeApp PRIVATE Qt5::Widgets)
project(ssss LANGUAGES CXX) #运行截图如下

Qt扫盲-CMake 使用概述_第4张图片

其实Qt 使用CMake 我个人使用的时候至少要几个功能:

  • 一、引入第三方库
  • 二、组织项目结构

有这些其实就是完全够用的

1. 引入Qt的库

注意要点就是 find_package() 引入包 target_link_libraries()来链接库 下面用示例来说明

  1. find_package() 理解
    find_package(Qt5 COMPONENTS 模块名 REQUIRED) 这里的模块名 可以是大写的也可以小写,我试验过了,都可以,但还是推荐首字母大写就行。模块名其实和qmake的一样,以 Qt SQL 模块举例,这个模块名就是下面 QT += sql 里面的 。sql
    也可以用 find_package(Qt模块名 REQUIRED)
    Qt扫盲-CMake 使用概述_第5张图片
# find_package() 引入包

# 写法1 -> 合并写法 推荐写这个
find_package(Qt5 COMPONENTS Core Widgets Sql Script SerialPort REQUIRED)

# 写法2 -> 分离写法
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5SerialPort REQUIRED)
find_package(Qt5Sql REQUIRED)
find_package(Qt5Script REQUIRED)

# 注意不能这么写,这种是错的
find_package(Qt5Core Qt5Widgets REQUIRED)
  1. target_link_libraries() 理解
    target_link_libraries(Hello PRIVATE Qt5::Widgets),第一个 Hello 就是可执行文件名,后面 PRIVATE 是修饰词可不管,后面的 Qt5::Widgets 就是链接的模块库的名字,后面可以继续追加库名
# 都是可以用的
target_link_libraries(Hello Qt5::Widgets)
target_link_libraries(Hello PRIVATE Qt5::Widgets)
target_link_libraries(Hello PRIVATE Qt5::Core Qt5::Widgets Qt5::Sql Qt5::SerialPort Qt5::Script)

这里写的一些变量的路径可以在 Qt Build 里配置的
Qt扫盲-CMake 使用概述_第6张图片

2.Qt CMake 引入第三方库

3. Qt CMake 项目目录

四、使用案例

cmake_minimum_required(VERSION 3.5)

project(CMakeAPP LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

file(GLOB_RECURSE SOURCES "*.cpp" "*.cxx" "*.cc")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE RESOURCES "*.qrc")
file(GLOB_RECURSE FORMS *.ui)

set(SRCS ${SOURCES} ${HEADERS} ${RESOURCES} ${FORMS})

source_group("Header" FILES ${HEADERS})
source_group("Sources" FILES ${SOURCES})
source_group("Ui" FILES ${FORMS})
source_group("Resource" FILES ${RESOURCES})

find_package(Qt5 COMPONENTS Core Widgets  Sql Script  SerialPort REQUIRED)

#find_package(Qt5Core REQUIRED)
#find_package(Qt5Widgets REQUIRED)
#find_package(Qt5SerialPort REQUIRED)
#find_package(Qt5Sql REQUIRED)
#find_package(Qt5Script REQUIRED)

foreach(plugin ${Qt5Network_PLUGINS})
    get_target_property(_loc ${plugin} LOCATION)
    message("Plugin ${plugin} is at location ${_loc}")
endforeach()

add_executable(CMakeAPP
    main.cpp
    MainWindow.cpp
    MainWindow.h
    MainWindow.ui

    ./Part1/NewWindow.cpp
    ./Part1/NewWindow.h
    ./Part1/NewWindow.ui

    ./Part2/form.cpp
    ./Part2/form.h
    ./Part2/form.ui
)

target_link_libraries(CMakeAPP PRIVATE Qt5::Core Qt5::Widgets Qt5::Sql Qt5::SerialPort Qt5::Script)

你可能感兴趣的:(#,▶,Qt扫盲,qt,cmake,Qt,Cmake)