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 项目
-
创建CMake 项目
其实和 qmake 创建项目一个流程,只是在选择 build 系统的时候选择 CMake 就可以啦,这里演示的是创建一个 界面软件的流程
-
生成的工程目录如下
-
CMake 的文件定位
其实我们所谓的写CMake其实就是 编写这个 CMakeLists 文件
三、简单介绍
这里就是简单介绍一下这个 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 我个人使用的时候至少要几个功能:
- 一、引入第三方库
- 二、组织项目结构
有这些其实就是完全够用的
1. 引入Qt的库
注意要点就是 find_package() 引入包 target_link_libraries()来链接库 下面用示例来说明
- find_package() 理解
find_package(Qt5 COMPONENTS 模块名 REQUIRED) 这里的模块名 可以是大写的也可以小写,我试验过了,都可以,但还是推荐首字母大写就行。模块名其实和qmake的一样,以 Qt SQL 模块举例,这个模块名就是下面 QT += sql 里面的 。sql。
也可以用 find_package(Qt模块名 REQUIRED)
# 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)
- 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 里配置的
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)