├── tutorials ├── preface.md ├── package.md └── installation.md ├── .gitignore ├── demos ├── commands │ ├── set │ │ └── CMakeLists.txt │ ├── find_package │ │ └── CMakeLists.txt │ └── project_1 │ │ └── CMakeLists.txt ├── qt │ └── uic │ │ ├── CMakeLists.txt │ │ ├── main.h │ │ └── main.cpp └── deb │ └── official_demo │ ├── CMakeLists.txt │ └── DistanceBetweenPoints.cxx ├── develop ├── assets │ ├── extension.png │ └── quick_start.png └── README.md ├── resources └── CMake_Practice.pdf ├── tests ├── main.cpp └── CMakeLists.txt ├── README.md ├── manuals └── commands │ ├── cmake_minimum_required.md │ ├── set.md │ ├── find_package.md │ └── project.md └── LICENSE /tutorials/preface.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/.vscode/** 2 | **/build/** -------------------------------------------------------------------------------- /demos/commands/set/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(3.13.3) -------------------------------------------------------------------------------- /develop/assets/extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiqimei/CMake-Tutorial/HEAD/develop/assets/extension.png -------------------------------------------------------------------------------- /resources/CMake_Practice.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiqimei/CMake-Tutorial/HEAD/resources/CMake_Practice.pdf -------------------------------------------------------------------------------- /tests/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int, char**) { 4 | std::cout << "Hello, world!\n"; 5 | } 6 | -------------------------------------------------------------------------------- /develop/assets/quick_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiqimei/CMake-Tutorial/HEAD/develop/assets/quick_start.png -------------------------------------------------------------------------------- /demos/commands/find_package/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.13.3) 2 | 3 | project(find_package) 4 | 5 | find_package(OpenCV QUIET) 6 | find_package(OpenCV) 7 | find_package(OpenCV REQUIRED) -------------------------------------------------------------------------------- /demos/qt/uic/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.13.3) 2 | 3 | project( 4 | "Digital Clock" 5 | VERSION 1.2.3 6 | ) 7 | 8 | 9 | set(QT Core Gui Widgets Network DBus Sql LinguistTools) 10 | find_package(Qt5 REQUIRED ${QT}) -------------------------------------------------------------------------------- /demos/qt/uic/main.h: -------------------------------------------------------------------------------- 1 | #ifndef MAIN_H 2 | #define MAIN_H 3 | 4 | #include 5 | 6 | QUrl getlink(){ 7 | 8 | QUrl url = QUrl::fromLocalFile(QDir::currentPath(); 9 | 10 | return url; 11 | 12 | } 13 | 14 | 15 | #endif // MAIN_H -------------------------------------------------------------------------------- /tests/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0.0) 2 | project(test VERSION 0.1.0) 3 | 4 | include(CTest) 5 | enable_testing() 6 | 7 | add_executable(test main.cpp) 8 | 9 | set(CPACK_PROJECT_NAME ${PROJECT_NAME}) 10 | set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) 11 | include(CPack) 12 | -------------------------------------------------------------------------------- /tutorials/package.md: -------------------------------------------------------------------------------- 1 | # 打包 2 | 你可以通过 CPack 来将源码打包成 `deb` 包。具体方法如下: 3 | 1. 首先在 `CMakeLists.txt` 文件中添加以下内容: 4 | ````cmake 5 | # Package 6 | SET(CPACK_GENERATOR "DEB") 7 | SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "维护者名称") #required 8 | 9 | INCLUDE(CPack) 10 | ```` 11 | 2. 接着在正常 `cmake ..` 预处理完成后,使用 `make package` 完成打包。 -------------------------------------------------------------------------------- /demos/qt/uic/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "main.h" 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 8 | QApplication app(argc, argv); 9 | 10 | QWebEngineView view; 11 | view.setUrl(getlink()); 12 | view.resize(1524, 850); 13 | view.show(); 14 | 15 | return app.exec(); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CMake 完全教程 2 | CMake 是一款强大的跨平台构建工具,虽然强大但上手也绝非简单。鉴于网上关于 CMake 的中文入门教程过少,特花费时间整理出此份 CMake 教程。 3 | 4 | # 目录 5 | - [前言](./tutorials/preface.md) 6 | 7 | # 参与 8 | ````bash 9 | git clone git@github.com:lolimay/CMake-Tutorial.git 10 | ```` 11 | 12 | # 其它资源 13 | 1. [CMake Tutorial - Official](https://cmake.org/cmake-tutorial/) 14 | 2. [CMake Documentation - Official](https://cmake.org/cmake/help/latest/index.html) 15 | 3. [CMake实践.pdf](./resources/CMake_Practice.pdf) 16 | 4. [CMake 入门实战 - HaHack](https://www.hahack.com/codes/cmake/#stq=&stp=0) 17 | 18 | -------------------------------------------------------------------------------- /demos/deb/official_demo/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.13.3) 2 | 3 | PROJECT(DistanceBetweenPoints) 4 | 5 | FIND_PACKAGE(VTK REQUIRED) 6 | INCLUDE(${VTK_USE_FILE}) 7 | 8 | ADD_EXECUTABLE(DistanceBetweenPoints DistanceBetweenPoints.cxx) 9 | 10 | INSTALL(TARGETS DistanceBetweenPoints DESTINATION bin) 11 | 12 | # Package 13 | SET(CPACK_GENERATOR "DEB") 14 | SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "维护者名称") #required 15 | 16 | INCLUDE(CPack) 17 | 18 | # To use this: 19 | # make package 20 | # sudo dpkg -i DistanceBetweenPoints-0.1.1-Linux.deb 21 | 22 | # This will result in the file: 23 | #/usr/distance/DistanceBetweenPoints 24 | -------------------------------------------------------------------------------- /demos/deb/official_demo/DistanceBetweenPoints.cxx: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int, char *[]) 4 | { 5 | // Create two points. 6 | double p0[3] = {0.0, 0.0, 0.0}; 7 | double p1[3] = {1.0, 1.0, 1.0}; 8 | 9 | // Find the squared distance between the points. 10 | double squaredDistance = vtkMath::Distance2BetweenPoints(p0, p1); 11 | 12 | // Take the square root to get the Euclidean distance between the points. 13 | double distance = sqrt(squaredDistance); 14 | 15 | // Output the results. 16 | std::cout << "SquaredDistance = " << squaredDistance << std::endl; 17 | std::cout << "Distance = " << distance << std::endl; 18 | 19 | return EXIT_SUCCESS; 20 | } 21 | -------------------------------------------------------------------------------- /tutorials/installation.md: -------------------------------------------------------------------------------- 1 | 本项目所有代码示例要求的最低 CMake 版本不低于 3.13.3 版本,你可以通过直接安装或编译安装获取最新版本的 CMake。 2 | 3 | 请先尝试直接从源中安装 CMake: 4 | 5 | # 直接安装 6 | ````bash 7 | sudo apt install cmake -y # 安装 CMake 8 | cmake --version # 查看 CMake 版本信息 9 | ```` 10 | 若源中的 CMake 版本低于 3.13.3,请尝试编译安装,方法如下: 11 | 12 | # 编译安装 13 | 这里以编译安装 CMake 3.13.3 为例,先从 [官网](https://cmake.org/download/) 下载最新版本的源码包,如 `cmake-3.13.3.tar.gz` ,接着打开终端输入以下命令: 14 | ````bash 15 | sudo apt install cmake -y # 先从源中安装旧版本的 cmake 16 | tar -zxcf cmake-3.13.3.tar.gz # 解压 17 | cd cmake-3.13.3 # 切换到 cmake-3.13.3 项目目录 18 | mkdir build && cd build # 新建并切换到构建目录 19 | cmake .. # CMake 构建生成 Makefile 文件 20 | make -j 8 # Make 构建生成最终的二进制可执行文件 21 | sudo apt purge cmake -y # 卸载旧版本的 cmake 22 | sudo make install # 安装新版本的 cmake 23 | cmake --version # 确认 cmake 3.13.3 是否安装成功 24 | ```` -------------------------------------------------------------------------------- /manuals/commands/cmake_minimum_required.md: -------------------------------------------------------------------------------- 1 | # cmake_minimum_required 2 | 3 | ## 定义 4 | 用于指定项目要求的最低 CMake 版本 5 | 6 | ## 用法 7 | ````cmake 8 | cmake_minimum_required(VERSION [.[.]]) 9 | ```` 10 | 11 | ## 备注 12 | 1. `[.[.]]` 表示小版本号(patch)可以单独省略,但当次版本号(minor)省略时小版本号(patch)也要同时省略,主版本号(major)不能省略。 13 | 2. 其实还有更小的版本号叫 tweak,但 CMake 的版本号最多只有 3 位,所以上面就没有写成 `[.[.[.]]]]` 了。 14 | 4. 其实 `cmake_minimum_required` 还可以指定项目要求的 CMake 最高不能超过某个版本号,具体用法请查看 [cmake_minimum_required - CMake Documentation](https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html?highlight=cmake_minimum_required)。 15 | 16 | ## 用例 17 | ````cmake 18 | # CMakeLists.txt 19 | 20 | cmake_minimum_required(VERSION 3) 21 | cmake_minimum_required(VERSION 3.13) 22 | cmake_minimum_required(VERSION 3.13.3) 23 | ```` 24 | -------------------------------------------------------------------------------- /develop/README.md: -------------------------------------------------------------------------------- 1 | # VScode + CMake Workflow 2 | 3 | ## VS Code 4 | [VS Code](https://github.com/Microsoft/vscode) 是一款强大的代码编辑器,结合 C++ 和 CMake 相关拓展,我们可以将 VS Code 配置成我们专属的 C++ IDE。 5 | 6 | ### 1 下载安装 7 | 8 | 打开 [VS Code 官网](https://code.visualstudio.com/),下载安装完成安装。 9 | 10 | ### 2 拓展安装 11 | - C/C++ 12 | - C++ Intellisense 13 | - C++ Clang Command Adapter 14 | - CMake Tools 15 | - CMake Tools Helper 16 | - CMake 17 | 18 | 打开 VS Code,点击左侧面板的拓展按钮,搜索上面列出的所有拓展并完成安装。 19 | 20 | 21 | 22 | ### 3 预备知识 23 | 在 VS Code 中,按下 F1 键会调出控制台,这个将会是我们最常用到的快捷键,因为大多数 VS Code 拓展都提供很多实用的控制台命令。 24 | 25 | ### 4 实战 26 | #### 初始化 CMake 项目 27 | 28 | 1. 按下 F1 键盘打开控制台,输入 `start` 回车初始化 CMake 项目 29 | 30 | ![](./assets/quick_start.png) 31 | 2. 这时 CMake Tools 会让我们输入项目名称和项目类型: 32 | - 需要注意的是这里输入的 CMake 项目名中间不能出现空格,建议单词间的空格使用下划线代替,否则会出错。(实际上,CMake的项目名是支持有空格的,更详细的介绍请看 [project](../manuals/commands/project.md) 命令) 33 | - 由于我们一般创建的 CMake 项目最终都是为了生成可执行文件,所以项目类型一般选择 `Executable`。 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 lolimay 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /demos/commands/project_1/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # 指定项目要求的最低 CMake 版本号 2 | # 注意!!! 版本号过低则很多 CMake 的新特性不会受到支持 3 | # 本 demo 要求 CMake 的最低版本号不低于 3.13.3 4 | cmake_minimum_required(VERSION 3.13.3) 5 | 6 | # 设置项目基本信息 7 | project( 8 | CMake_Tutorial 9 | VERSION 1.3.0 10 | DESCRIPTION "an awesome Chinese CMake tutorial!" 11 | HOMEPAGE_URL "https://github.com/lolimay/CMake-Tutorial" 12 | LANGUAGES CXX 13 | ) 14 | # 备注: 15 | # CMake 的项目名一般为一个单词或多个单词使用下划线连接,如果项目名中出现了空格 16 | # 则必须要使用双引号引用起来,如 project("CMake Tutorial")。但是不建议这样做。 17 | 18 | # 输出调试信息 19 | message("Project Name: " ${PROJECT_NAME}) 20 | message("Version Info: " ${PROJECT_VERSION}) 21 | message("Major Version Number: " ${PROJECT_VERSION_MAJOR}) 22 | message("Minor Version Number: " ${PROJECT_VERSION_MINOR}) 23 | message("Patch Version Number: " ${PROJECT_VERSION_PATCH}) 24 | message("Tweak Version Number: " ${PROJECT_VERSION_TWEAK}) 25 | 26 | # 判断项目是否有 tweak 版本号 27 | if(PROJECT_VERSION_TWEAK STREQUAL "") 28 | message("There is no tweak version number!") 29 | else() 30 | message("VERSION_TWEAK " ${PROJECT_VERSION_TWEAK}) 31 | endif() 32 | # 备注: 33 | # 1. 当没有 tweak 版本号时,则 PROJECT_VERSION_TWEAK 变量的内容是空字符串 34 | # 2. 格外注意!!! 在大部分情况下 CMake 的变量都需要通过 ${} 引用 35 | # 但是在 if 条件中则不需要加 ${},直接使用变量名 36 | # 3. CMake 比较字符串是否相等的运算符是 STREQUAL 而不是 EQUAL 37 | 38 | # 输出调试信息 39 | message("Project Description: " ${PROJECT_DESCRIPTION}) 40 | message("Project Homepage: " ${PROJECT_HOMEPAGE_URL}) -------------------------------------------------------------------------------- /manuals/commands/set.md: -------------------------------------------------------------------------------- 1 | # set 2 | 3 | ## 定义 4 | 用于为变量(普通变量、缓存变量、环境变量)赋值 5 | 6 | ## 用法 7 | ````cmake 8 | set( ...) 9 | ```` 10 | 11 | ## 常用变量 12 | - CMAKE_CXX_STANDARD `C++ 标准版本` 13 | - CMAKE_INCLUDE_CURRENT_DIR `是否自动将当前的源目录和构建目录添加包含路径` 14 | - CMAKE_INSTALL_PREFIX `软件安装路径前缀` 15 | CMAKE_INSTALL_PREFIX 的默认值是 `/usr/local`,当我们使用 16 | ````cmake 17 | install(TARGETS ${PROJECT_NAME} DESTINATION bin) 18 | ```` 19 | 我们项目经过构建最终生成的二进制文件就会被安装到 `/usr/local/bin` 目录下。 20 | - CMAKE_EXPORT_COMPILE_COMMANDS `是否导出编译过程到 compile_commands.json 文件中` 21 | ### Qt 变量 22 | Qt 是一个强大的 C++ 跨平台界面开发框架。Qt 在构建其项目时主要有 3 步预处理工作: moc、rcc 和 uic。首先,从 Qt 继承而来的类中只要使用了 Q_OBJECT 宏,都必须使用 moc 工具将其预处理成对应的 moc 文件。其次,Qt 的界面文件是 `*.ui`,在构建过程中,Qt 则会使用 uic 工具将其预处理成对应的头文件 `ui_*.h`。最后,Qt 还需要使用 rcc 工具处理它的资源文件 *.qrc,将其编译成对应的源代码文件 `qrc_*.cpp` 或独立的二进制资源文件 `*.rcc`。 23 | 24 | - CMAKE_AUTOMOC `是否自动使用 moc 处理源文件` (适用于 Qt 项目) 25 | 26 | > Qt 将源代码交给标准 C++ 编译器之前,需要将 Qt 的扩展语法替换掉,完成这一操作的就是 moc 工具。 moc 全称是 Meta-Object Compiler(元对象编译器),moc 会分析 C++ 源文件,如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个在原文件名前加上 `moc_` 前缀的 C++ 源文件,这个新的源文件中包含了 Q_OBJECT 宏的实现代码。 27 | - CMAKE_AUTORCC `是否自动使用 rcc 处理 *.qrc 文件` (适用于 Qt 项目) 28 | > Qt 的 rcc 工具用于将 `*qrc` 文件中描述的图片、文档等文件编译成编译成对应的源代码文件 `qrc_*.cpp` 或者独立的二进制资源文件 `*.rcc`。 29 | - CMAKE_AUTORCC `是否自动使用 uic 处理 *.ui 文件` (适用于 Qt 项目) 30 | > Qt 的 31 | ## 用例 32 | ````cmake 33 | # CMakeLists.txt 34 | 35 | cmake_minimum_required(VERSION 3) 36 | cmake_minimum_required(VERSION 3.13) 37 | cmake_minimum_required(VERSION 3.13.3) 38 | ```` -------------------------------------------------------------------------------- /manuals/commands/find_package.md: -------------------------------------------------------------------------------- 1 | # find_package 2 | 3 | ## 定义 4 | 查找外部项目并加载其设置 5 | 6 | ## 用法 7 | ````cmake 8 | find_package( [version] [EXACT] [QUIET] [MODULE] 9 | [REQUIRED] [[COMPONENTS] [components...]] 10 | [OPTIONAL_COMPONENTS components...] 11 | [NO_POLICY_SCOPE]) 12 | ```` 13 | ## 可选参数 14 | - QUIET `若 package 没有被找到,不输出任何警告和错误信息` 15 | - REQUIRED `当 package 没有被找到时,立即停止并输出错误信息` 16 | 17 | 更多用法请参考官方英文文档: [find_package - CMake Doc](https://cmake.org/cmake/help/latest/command/find_package.html) 18 | 19 | 20 | ## 相关关键字 21 | - \_FOUND `当被找到时为真否则为假` 22 | 23 | ## 用例 24 | ````cmake 25 | cmake_minimum_required(VERSION 3.13.3) 26 | 27 | project(find_package) 28 | 29 | find_package(OpenCV QUIET) 30 | find_package(OpenCV) 31 | find_package(OpenCV REQUIRED) 32 | ```` 33 | 34 | ### 输出 35 | ````cmake 36 | # find_package(OpenCV QUIET) OpenCV包未找到->不输出任何警告和错误信息 37 | 38 | # find_package(OpenCV) OpenCV包未找到->输出警告信息,但继续处理 39 | CMake Warning at CMakeLists.txt:7 (find_package): 40 | By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has 41 | asked CMake to find a package configuration file provided by "OpenCV", but 42 | CMake did not find one. 43 | 44 | Could not find a package configuration file provided by "OpenCV" with any 45 | of the following names: 46 | 47 | OpenCVConfig.cmake 48 | opencv-config.cmake 49 | 50 | Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set 51 | "OpenCV_DIR" to a directory containing one of the above files. If "OpenCV" 52 | provides a separate development package or SDK, be sure it has been 53 | installed. 54 | 55 | # find_package(OpenCV) OpenCV包未找到->输出错误信息,立即终止 56 | CMake Error at CMakeLists.txt:8 (find_package): 57 | By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has 58 | asked CMake to find a package configuration file provided by "OpenCV", but 59 | CMake did not find one. 60 | 61 | Could not find a package configuration file provided by "OpenCV" with any 62 | of the following names: 63 | 64 | OpenCVConfig.cmake 65 | opencv-config.cmake 66 | 67 | Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set 68 | "OpenCV_DIR" to a directory containing one of the above files. If "OpenCV" 69 | provides a separate development package or SDK, be sure it has been 70 | installed. 71 | 72 | 73 | -- Configuring incomplete, errors occurred! # 处理未完成 74 | ```` -------------------------------------------------------------------------------- /manuals/commands/project.md: -------------------------------------------------------------------------------- 1 | # project 2 | ## 定义 3 | 用于指定项目的详细信息,如项目名称、版本、描述、主页以及项目主要使用的编程语言等。 4 | ## 用法 5 | ````cmake 6 | project( 7 | [VERSION [.[.[.]]]] 8 | [DESCRIPTION ] 9 | [HOMEPAGE_URL ] 10 | [LANGUAGES ...]) 11 | ```` 12 | ## 相关关键字 13 | - PROJECT_NAME `当前项目名称` 14 | - PROJECT_SOURCE_DIR `项目源代码路径` 15 | - PROJECT_BINARY_DIR `项目二进制文件路径` 16 | - PROJECT_VERSION `项目版本号` 17 | - PROJECT_VERSION_MAJOR `项目主版本号` 18 | - PROJECT_VERSION_MINOR `项目次版本号` 19 | - PROJECT_VERSION_PATCH `项目小版本号` 20 | - PROJECT_VERSION_TWEAK `项目末版本号` 21 | - PROJECT_DESCRIPTION `项目描述` 22 | - PROJECT_HOMEPAGE_URL `项目主页地址` 23 | - CMAKE_PROJECT_\_INCLUDE `包含上一层目录` 24 | - CMAKE_PROJECT_NAME `根项目名称` 25 | - CMAKE_PROJECT_VERSION `根项目名称` 26 | - CMAKE_PROJECT_DESCRIPTION `根项目描述` 27 | - CMAKE_PROJECT_HOMEPAGE_URL `根项目主页地址` 28 | 29 | ## 备注 30 | 1. CMake 默认认为当前项目所用的编程语言是 `C/C++` ,此时 LANGUAGES 参数项可以缺省不填。当使用 CMake 去构建其它项目时(如汇编 `ASM`、`CUDA` 等),需要指定LANGUAGES 参数项。 31 | 32 | > Optionally you can specify which languages your project supports. Example languages include C, CXX (i.e. C++), CUDA, Fortran, and ASM. By default C and CXX are enabled if no language options are given. Specify language NONE, or use the LANGUAGES keyword and list no languages, to skip enabling any languages. 33 | > 34 | > If enabling ASM, list it last so that CMake can check whether compilers for other languages like C work for assembly too. 35 | 36 | ## 用例 37 | ````cmake 38 | # 指定项目要求的最低 CMake 版本号 39 | # 注意!!! 版本号过低则很多 CMake 的新特性不会受到支持 40 | # 本 demo 要求 CMake 的最低版本号不低于 3.13.3 41 | cmake_minimum_required(VERSION 3.13.3) 42 | 43 | # 设置项目基本信息 44 | project( 45 | CMake_Tutorial 46 | VERSION 1.3.0 47 | DESCRIPTION "an awesome Chinese CMake tutorial!" 48 | HOMEPAGE_URL "https://github.com/lolimay/CMake-Tutorial" 49 | LANGUAGES CXX 50 | ) 51 | # 备注: 52 | # CMake 的项目名一般为一个单词或多个单词使用下划线连接,如果项目名中出现了空格 53 | # 则必须要使用双引号引用起来,如 project("CMake Tutorial")。但是不建议这样做。 54 | 55 | # 输出调试信息 56 | message("Project Name: " ${PROJECT_NAME}) 57 | message("Version Info: " ${PROJECT_VERSION}) 58 | message("Major Version Number: " ${PROJECT_VERSION_MAJOR}) 59 | message("Minor Version Number: " ${PROJECT_VERSION_MINOR}) 60 | message("Patch Version Number: " ${PROJECT_VERSION_PATCH}) 61 | message("Tweak Version Number: " ${PROJECT_VERSION_TWEAK}) 62 | 63 | # 判断项目是否有 tweak 版本号 64 | if(PROJECT_VERSION_TWEAK STREQUAL "") 65 | message("There is no tweak version number!") 66 | else() 67 | message("VERSION_TWEAK " ${PROJECT_VERSION_TWEAK}) 68 | endif() 69 | # 备注: 70 | # 1. 当没有 tweak 版本号时,则 PROJECT_VERSION_TWEAK 变量的内容是空字符串 71 | # 2. 格外注意!!! 在大部分情况下 CMake 的变量都需要通过 ${} 引用 72 | # 但是在 if 条件中则不需要加 ${},直接使用变量名 73 | # 3. CMake 比较字符串是否相等的运算符是 STREQUAL 而不是 EQUAL 74 | 75 | # 输出调试信息 76 | message("Project Description: " ${PROJECT_DESCRIPTION}) 77 | message("Project Homepage: " ${PROJECT_HOMEPAGE_URL}) 78 | ```` 79 | 80 |

源代码地址

--------------------------------------------------------------------------------