双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记

为什么要学习现代 CMake?

  • 现代 CMake 指的是 CMake 3.x。
  • 古代 CMake 指的是 CMake 2.x。
  • 通过互联网和学校课程,许多人认识的 CMake 都是古代 CMake。
  • 现代 CMake 和古代 CMake 相比,使用更方便,功能更强大。
# 古代 CMake
mkdir -p build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4
make install
cd ..# 现代 CMake
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel 4
cmake --build build --target install
# 古代 CMake:
cmake_minimum_required(VERSION 2.8)
project(MyProject)list(APPEND CMAKE_MODULE_PATH "<path to FindTBB module>")find_package(TBB COMPONENTS tbb tbbmalloc)
if (NOT TBB_FOUND)message(FATAL_ERROR "TBB not found")
endif()add_executable(myapp myapp)
target_include_directories(myapp ${TBB_INCLUDE_DIRS})
target_compile_definitions(myapp ${TBB_DEFINITIONS})
target_link_libraries(myapp ${TBB_LIBRARIES})
现代 CMake
cmake_minimum_required(VERSION 3.12)
project(MyProject LANGUAGES CXX)find_package(TBB COMPONENTS tbb tbbmalloc REQUIRED)add_executable(myapp myapp)
target_link_libraries(myapp TBB::tbb TBB::tbbmalloc)

第 0 章:命令行小技巧

传统的 CMake 软件构建/安装方式

命令 说明
mkdir build 需要先创建 build 目录
cd build 切换到 build 目录
cmake … 在 build 目录运行 cmake <源码目录> 生成 Makefile
make -j4 执行本地的构建系统 make 真正开始构建(4 进程并行)
sudo make install 让本地的构建系统执行安装步骤
cd … 回到源码目录

现代 CMake 提供了更方便的 -B 和 --build 指令,不同平台,统一命令!

命令 说明
cmake -B build 在源码目录用 -B 直接创建 build 目录并生成 build/Makefile
cmake --build build -j4 自动调用本地的构建系统在 build 里构建,即:make -C build -j4
sudo cmake --build build --target install 调用本地的构建系统执行 install 这个目标,即安装
cmake -B build 免去了先创建 build 目录再切换进去再指定源码目录的麻烦。
cmake --build build 统一了不同平台(Linux 上会调用 make,Windows 上调用 devenv.exe)

结论:从现在开始,如果在命令行操作 cmake,请使用更方便的 -B 和 --build 命令。

可见 CMake 项目的构建分为两步:

  • 第一步是 cmake -B build,称为配置阶段(configure),这时只检测环境并生成构建规则,会在 build 目录下生成本地构建系统能识别的项目文件(Makefile 或是 .sln)
  • 第二步是 cmake --build build,称为构建阶段(build),这时才实际调用编译器来编译代码。

-D 选项

-D:指定配置变量(又称缓存变量)
在配置阶段可以通过 -D 设置缓存变量。第二次配置时,之前的 -D 添加仍然会被保留。

例:

cmake -B build -DCMAKE_INSTALL_PREFIX=/opt/openvdb-8.0

设置安装路径为 /opt/openvdb-8.0(会安装到 /opt/openvdb-8.0/lib/libopenvdb.so)

cmake -B build -DCMAKE_BUILD_TYPE=Release

设置构建模式为发布模式(开启全部优化)

cmake -B build

第二次配置时没有 -D 参数,但是之前的 -D 设置的变量都会被保留(此时缓存里仍有你之前定义的 CMAKE_BUILD_TYPE 和 CMAKE_INSTALL_PREFIX)

-G 选项

-G 选项:指定要用的生成器

众所周知,CMake 是一个跨平台的构建系统,可以从 CMakeLists.txt 生成不同类型的构建系统(比如 Linux 的 make,Windows 的 MSBuild),从而让构建规则可以只写一份,跨平台使用。
过去的软件(例如 TBB)要跨平台,只好 Makefile 的构建规则写一份,MSBuild 也写一份。
现在只需要写一次 CMakeLists.txt,他会视不同的操作系统,生成不同构建系统的规则文件。
那个和操作系统绑定的构建系统(make、MSBuild)称为本地构建系统(native buildsystem)。
负责从 CMakeLists.txt 生成本地构建系统构建规则文件的,称为生成器(generator)。

$cmake.exe -G
CMake Error: No generator specified for -GGeneratorsVisual Studio 16 2019        = Generates Visual Studio 2019 project files.Use -A option to specify architecture.Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.Optional [arch] can be "Win64" or "ARM".Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.Optional [arch] can be "Win64" or "ARM".Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.Optional [arch] can be "Win64" or "ARM".Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.Optional [arch] can be "Win64" or "ARM".Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.Optional [arch] can be "Win64" or "IA64".Visual Studio 9 2008 [arch]  = Generates Visual Studio 2008 project files.Optional [arch] can be "Win64" or "IA64".Borland Makefiles            = Generates Borland makefiles.
* NMake Makefiles              = Generates NMake makefiles.NMake Makefiles JOM          = Generates JOM makefiles.MSYS Makefiles               = Generates MSYS makefiles.MinGW Makefiles              = Generates a make file for use withmingw32-make.Unix Makefiles               = Generates standard UNIX makefiles.Green Hills MULTI            = Generates Green Hills MULTI files(experimental, work-in-progress).Ninja                        = Generates build.ninja files.Ninja Multi-Config           = Generates build-<Config>.ninja files.Watcom WMake                 = Generates Watcom WMake makefiles.CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.CodeBlocks - NMake Makefiles JOM= Generates CodeBlocks project files.CodeBlocks - Ninja           = Generates CodeBlocks project files.CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files.CodeLite - MinGW Makefiles   = Generates CodeLite project files.CodeLite - NMake Makefiles   = Generates CodeLite project files.CodeLite - Ninja             = Generates CodeLite project files.CodeLite - Unix Makefiles    = Generates CodeLite project files.Sublime Text 2 - MinGW Makefiles= Generates Sublime Text 2 project files.Sublime Text 2 - NMake Makefiles= Generates Sublime Text 2 project files.Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files.Sublime Text 2 - Unix Makefiles= Generates Sublime Text 2 project files.Kate - MinGW Makefiles       = Generates Kate project files.Kate - NMake Makefiles       = Generates Kate project files.Kate - Ninja                 = Generates Kate project files.Kate - Unix Makefiles        = Generates Kate project files.Eclipse CDT4 - NMake Makefiles= Generates Eclipse CDT 4.0 project files.Eclipse CDT4 - MinGW Makefiles= Generates Eclipse CDT 4.0 project files.Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files.Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.

Linux 系统上的 CMake 默认用是 Unix Makefiles 生成器;Windows 系统默认是 Visual Studio 2019 生成器;MacOS 系统默认是 Xcode 生成器。

可以用 -G 参数改用别的生成器,例如 cmake -GNinja 会生成 Ninja 这个构建系统的构建规则。Ninja 是一个高性能,跨平台的构建系统,Linux、Windows、MacOS 上都可以用。

Ninja 可以从包管理器里安装,没有包管理器的 Windows 可以用 Python 的包管理器安装:

pip install ninja

(有趣的事实:CMake 也可以通过 pip install cmake 安装……)

事实上,MSBuild 是单核心的构建系统,Makefile 虽然多核心但因历史兼容原因效率一般。而 Ninja 则是专为性能优化的构建系统,他和 CMake 结合都是行业标准了。

$cmake -GNinja -B build

生成物:

$ls build
build.ninja CMakeCache.txt  CMakeFiles  cmake_install.cmake

现代CMake高级教程 - 第 0 章:命令行小技巧相关推荐

  1. 现代CMake高级教程 - 第 3 章:链接库文件

    双笙子佯谬老师的[公开课]现代CMake高级教程课程笔记 第 3 章:链接库文件 main.cpp 调用 mylib.cpp 里的 say_hello 函数 $tree . ├── CMakeList ...

  2. 现代CMake高级教程 - 第 1 章:添加源文件

    双笙子佯谬老师的[公开课]现代CMake高级教程课程笔记 第 1 章:添加源文件 例 1 一个 .cpp 源文件用于测试 // main.cpp #include <cstdio>int ...

  3. Linux 命令行小技巧《叹号的用处》

    bash 的历史记录里保留了输入的命令行记录.以下是如何充分利用该记录和!符号的使用教程. history的基础 HISTSIZE 变量值设置保存在历史列表中的命令数.默认情况下,该值为 500.这些 ...

  4. mac 命令行小技巧--mas 替代appstore

    安装: brew install mas 1. 用命令 mas search 关键词 查询应用.比如在终端中执行 mas search xcode,大概 1 秒就显示了结果: 2. 用命令 mas l ...

  5. 现代CMake高级教程

    文章目录 1.为什么要学习现代 CMake? 2.命令行小技巧 (1)传统的 CMake 软件构建/安装方式 (2)现代 CMake 提供了更方便的 -B 和 --build 指令,不同平台,统一命令 ...

  6. MySQL8.0.25命令行安装与配置

    MySQL8.0.25命令行安装与配置 一.下载MySQL 在MySQL官网下载mysql 点击进入: 在这里我们选用命令行安装配置的服务器版 将下载好的软件压缩包解压(建议不要放在C盘) 解压后的界 ...

  7. Homebrew进阶使用教程(二)-用一个命令行天气客户端构建自己的仓库

    [homebrew 系列文章] HomeBrew常规使用教程 Homebrew进阶使用教程(一) Homebrew进阶使用教程(二)-用一个命令行天气客户端构建自己的仓库 Homebrew进阶使用教程 ...

  8. 计算机ping 的快捷键,Ping命令使用小技巧

    win7系统中,ping命令的使用可以说是网络故障的宿敌,在ping命令的操作下,各种网络故障都能够被轻松排查,一键重装系统 小编来讲解一下Ping命令使用小技巧吧. Ping命令使用时需要注意:成功 ...

  9. 【笔记】C++ 命令行小游戏 节奏大师(别踩白块) 的制作

    一.游戏介绍 计组实验大作业要在板子上做一个小游戏,我们组要做节奏大师,先在命令行里做了一个,主界面只有4*20. 可以选歌,目前支持的有:1.两只老虎, 2.两只老虎无尽版. 开始游戏后∗*∗号会从 ...

最新文章

  1. 《Delphi 算法与数据结构》学习与感悟[3]: 获取一个字节中非空位的个数
  2. Flex与ASP.NET通过Remoting方式进行通讯
  3. 设计模式:迭代器模式
  4. taylor+swift纽约公寓_豪宅控!Taylor Swift究竟有多喜欢买豪宅!
  5. PE文件感染和内存驻留
  6. 通过SQL即可让监控分析更简单更高效
  7. 无连接可靠传输_FPC连接器的特点以及弹片微针模组的作用
  8. visual studio 11开发Win8模板
  9. arccatalog点要素显示不完_初中生到底要不要住校?班主任:不建议,看完这3点你就明白了...
  10. 系统集成项目管理工程师02《项目立项管理》
  11. 苹果android投屏,iPhone苹果手机如何投屏到电视?三种方法亲测详解!
  12. 计算机组装与维修第3版,计算机组装与维护(第3版)
  13. 向安装包中添加设备 UDID. 蒲公英内测
  14. 多线程学习--案例-子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次
  15. python 公众号 关注者位置_微信公众号获取用户地理位置
  16. AD软件PCB快捷键
  17. C++常用 math 函数
  18. 阿里云服务器学生应该怎么购买教程以及将远程主机配置成服务器教程
  19. 计算机如果没有什么 就无法启动,电脑开机没有任何反应
  20. BootLoader——嵌入式系统的引导加载程序

热门文章

  1. java listfile为null_java学习日志---File实例:实现复制整个文件夹、解决listFiles()为null问题...
  2. cgo+gSoap+onvif学习总结:6、进行PTZ控制
  3. 对标stripe,国有基金加持,MallBook如何引领分账时代
  4. vcenter Java接口,vcenter api 接口获取开发
  5. RecyclerView加载sdcard/Music下的音乐列表
  6. Fusker - A NodeJS Security Framework
  7. SVG阴影滤镜及渐变基础
  8. Citavi在Word中无法启用 的解决方法
  9. 新人大餐:2018最新Office插件开发之ExcelDNA开发XLL插件免费教学视频,五分钟包教包会...
  10. Python实现VIIRS气溶胶产品重投影-类GLT实现