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

本文介绍了现代CMake与古代CMake的区别,强调了CMake3.x版本的便利性和强大功能。现代CMake简化了构建和安装流程,使用-B和--build命令提高了效率。同时,提到了-D选项用于设置配置变量,以及-G选项选择生成器,如Ninja,以实现高性能跨平台构建。CMake的配置阶段和构建阶段以及如何通过CMakeLists.txt生成本地构建系统的规则文件也进行了阐述。

双笙子佯谬老师的【公开课】现代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 -G

Generators
  Visual 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 with
                                 mingw32-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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值