简短的回答是你没有,但没有它可能很难构建项目。
CMake 不构建代码,而是一个构建文件生成器。它是由 KitWare 开发的(在 2000 年左右的 ITK 项目期间),以使跨多个平台的构建代码“更简单”。它不是一种易于使用的语言(Kitware 公开承认这一点),但它统一了 Windows、Mac 和 Linux 在构建代码时所做的不同操作。
- 在 Linux 上,autoconf 通常用于生成构建文件,然后由 gcc/g++(和/或 clang)编译
- 在 Windows 上,您通常会使用 Visual Studio IDE 并创建他们所谓的“解决方案”,然后由 msvc(Microsoft Visual C++ 编译器)编译
- 在 Mac 上,我承认我不熟悉使用的编译器,但我相信它与 XCode 有关
CMake 让您可以编写一个脚本,用于在多台机器上构建并为每台机器指定不同的选项。
与 C++ 一样,CMake 也分为传统/旧式 CMake(版本 = 3.0)。 使用现代 CMake。以下是优秀的教程:
-
Effective CMake, by Daniel Pfeifer, C++Now 2017*
- Modern CMake Patterns, by Matheiu Ropert, CppCon 2017
- Better CMake
- CMake Tutorial
*在 C++Now 2017 大会上获得最有用的演讲
按照列出的顺序观看这些内容。您将了解 Modern CMake(以及旧式 CMake)的外观,并了解其原理
- CMake 可帮助您指定构建顺序和依赖项,并且
- 现代 CMake 有助于防止在扩展到更大的项目时创建循环依赖项和常见错误。
此外,最后一个视频介绍了 C++ 的包管理器(在使用外部库时很有用,例如 Boost,您可以在其中使用 CMake find_package() 命令),其中最常见的两个是:
-
vcpkg,和
- Conan
一般来说,
-
将目标视为对象
一个。有两种,executables和libraries,它们是用
“构建”的
add_executable(myexe ...) # Creates an executable target "myexe"
add_library(mylib ...) # Creates a library target "mylib"
- 每个目标都有属性,它们是目标的变量。但是,它们用 下划线 指定,而不是点,并且(通常)使用大写字母
myexe_FOO_PROPERTY # Foo property for myexe target
- CMake 中的函数还可以在运行时设置目标“对象”(在后台)的一些属性
target_compile_definitions()/features()/options()
target_sources()
target_include_directories()
target_link_libraries()
-
CMake 是一种命令语言,类似于 shell 脚本,但 没有命令的嵌套或管道。而是
一个。每个命令(函数)都在自己的行中并且做一件事
湾。所有命令(函数)的参数都是字符串
C。除非目标的名称被显式传递给函数,否则该命令适用于最后创建的目标
add_executable(myexe ...) # Create exe target
target_compile_definitions(...) # Applies to "myexe"
target_include_directories(...) # Applies to "myexe"
# ...etc.
add_library(mylib ...) # Create lib target
target_sources(...) # Applies to "mylib"
# ...etc.
d。命令按从上到下的顺序执行(注意:如果一个目标需要另一个目标,则必须先创建目标)
-
执行范围是当前活动的CMakeLists.txt文件。可以使用add_subdirectory() 命令运行其他文件(添加到范围)
一个。 这很像 shell exec 命令;当前的 CMake 环境(目标和属性,PRIVATE 属性除外)被“复制”到新的范围(“shell”)中,在该范围内完成了额外的工作。
b.但是,“环境”不是 shell 环境(CMake 目标属性不会像 $PATH 这样的环境变量传递给 shell)。相反,CMake 语言 维护顶级全局范围CACHE
中的所有目标和属性
-
PRIVATE 属性被当前模块使用。 INTERFACE 属性被传递给子目录模块。 PUBLIC 用于当前模块和子模块(该属性适用于当前模块,适用于/应该由链接到它的模块使用)。
-
target_link_libraries 用于直接模块依赖,但它也解析所有传递依赖。这意味着当您链接到某个库时,您还将获得父模块的所有 PUBLIC 属性。
一个。如果要链接到具有直接路径的库,可以使用target_link_libraries、和
b.如果你想用一个项目链接到一个模块并获取它的接口,你也可以使用target_link_libraries
您在 CMakeLists.txt 文件上运行 CMake 以生成系统所需的构建文件(ninja、Visual Studio solution、Linux make 等)并运行这些文件以编译和链接代码。