cmake开始使用cmake


备注

CMake是一种用于定义和管理代码构建的工具,主要用于C ++。

CMake是一个跨平台的工具;我们的想法是对项目的构建方式进行单一定义 - 这可以转化为任何支持平台的特定构建定义。

它通过与不同平台特定的构建系统配对来实现这一点; CMake是一个中间步骤,它为不同的特定平台生成构建输入。在Linux上,CMake生成Makefile;在Windows上,它可以生成Visual Studio项目,等等。

构建行为在CMakeLists.txt文件中定义 - 源代码的每个目录中都有一个。每个目录的CMakeLists文件定义了构建系统在该特定目录中应该执行的操作。它还定义了CMake应该处理的子目录。

典型的行动包括:

  • 从此目录中的某些源文件构建库或可执行文件。
  • 将文件路径添加到构建期间使用的包含路径。
  • 定义构建系统将在此目录及其子目录中使用的变量。
  • 根据特定的构建配置生成文件。
  • 找到源树中某个位置的库。

最终的CMakeLists文件可以非常清晰明了,因为每个文件的范围都非常有限。每个只处理当前目录中存在的构建。

有关CMake的官方资源,请参阅CMake的文档教程

版本

发布日期
3.9 2017年7月18日
3.8 2017年4月10日
3.7 2016年11月11日
3.6 2016年7月7日
3.5 2016年3月8日
3.4 2015年11月12日
3.3 学习网站
3.2 2015年3月10日
3.1 情节中字
3.0 2014年6月10日
2.8.12.1 2013年11月8日
2.8.12 二〇一三年十月一十一日
2.8.11 2013年5月16日
2.8.10.2 2012年11月27日
2.8.10.1 2012-11-07
2.8.10 2012-10-31
2.8.9 2012-08-09
2.8.8 2012-04-18
2.8.7 2011-12-30
2.8.6 2011-12-30
2.8.5 2011-07-08
2.8.4 2011-02-16
2.8.3 2010-11-03
2.8.2 2010-06-28
2.8.1 2010-03-17
2.8 2009-11-13
2.6 2008-05-05

“Hello World”作为图书馆

此示例显示如何将“Hello World”程序部署为库以及如何将其与其他目标链接。

假设我们拥有与http://www.riptutorial.com/cmake/example/22391/-hello-world--with-multiple-source-files示例相同的源/头文件集。相反,从多个源文件建立的,我们可以先部署foo.cpp ,通过使用图书馆add_library() 之后与主程序与链接它target_link_libraries()

我们将CMakeLists.txt修改为

cmake_minimum_required(VERSION 2.4)

project(hello_world)

include_directories(${PROJECT_SOURCE_DIR})
add_library(applib foo.cpp)
add_executable(app main.cpp)
target_link_libraries(app applib)
 

并按照相同的步骤,我们将得到相同的结果。

带有多个源文件的“Hello World”

首先我们可以通过include_directories() 指定头文件的目录,然后我们需要通过add_executable() 指定目标可执行文件的相应源文件,并确保源文件中只有一个main() 函数。

以下是一个简单示例,假设所有文件都放在PROJECT_SOURCE_DIR 目录中。

main.cpp中

#include "foo.h"

int main()
{
    foo();
    return 0;
}
 

foo.h中

void foo();
 

Foo.cpp中

#include <iostream>
#include "foo.h"

void foo()
{
    std::cout << "Hello World!\n";
}
 

的CMakeLists.txt

cmake_minimum_required(VERSION 2.4)

project(hello_world)

include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.cpp foo.cpp)  # be sure there's exactly one main() function in the source files
 

我们可以按照上面示例中的相同步骤来构建我们的项目。然后执行app 将打印

>./app
Hello World!
 

CMake安装

转到CMake下载页面,获取操作系统的二进制文件,例如Windows,Linux或Mac OS X.在Windows上双击要安装的二进制文件。在Linux上从终端运行二进制文件。

在Linux上,您还可以从发行版的软件包管理器安装软件包。在Ubuntu 16.04上,您可以使用以下命令安装命令行和图形应用程序:

sudo apt-get install cmake
sudo apt-get install cmake-gui
 

在FreeBSD上,您可以使用以下命令安装命令行和基于Qt的图形应用程序:

pkg install cmake
pkg install cmake-gui
 

在Mac OSX上,如果您使用其中一个可用的软件包管理器来安装软件,最值得注意的是MacPorts( MacPorts )和Homebrew( Homebrew ),您也可以通过其中一个安装CMake。例如,在MacPorts的情况下,键入以下内容

sudo port install cmake  
 

将安装CMake,如果您使用Homebrew包管理器,您将键入

brew install cmake
 

安装CMake后,您可以通过执行以下操作轻松检查

cmake --version
 

您应该看到类似于以下内容的内容

cmake version 3.5.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).
 

简单的“Hello World”项目

给定定义main() 函数的C ++源文件main.cpp ,附带的CMakeLists.txt 文件(具有以下内容)将指示CMake为当前系统和默认C ++编译器生成适当的构建指令。

main.cpp C ++ Hello World示例

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    return 0;
}
 

的CMakeLists.txt

cmake_minimum_required(VERSION 2.4)

project(hello_world)

add_executable(app main.cpp)
 

在Coliru现场观看

  1. cmake_minimum_required(VERSION 2.4) 设置评估当前脚本所需的最小CMake版本。

  2. project(hello_world) 启动一个新的CMake项目。这将触发大量内部CMake逻辑,尤其是检测默认的C和C ++编译器。

  3. 使用add_executable(app main.cpp) 创建一个构建目标app ,它将使用当前设置的一些默认标志调用已配置的编译器,以便从给定的源文件main.cpp 编译可执行app

命令行 (In-Source-Build,不推荐)

> cmake .
...
> cmake --build .
 

cmake . 编译器检测,评估给定的CMakeLists.txt . 目录并在当前工作目录中生成构建环境。

cmake --build . command是必要的build / make调用的抽象。

命令行 (Out-of-source,推荐)

为了保持源代码不受任何构建工件的影响,您应该执行“源外”构建。

> mkdir build
> cd build
> cmake ..
> cmake --build .
 

或者CMake也可以从上面的示例中抽象出你的平台shell的基本命令:

> cmake -E make_directory build
> cmake -E chdir build cmake .. 
> cmake --build build 
 

在构建类型之间切换,例如调试和发布

CMake知道几种构建类型,这些类型通常会影响默认编译器和链接器参数(例如正在创建的调试信息)或替代代码路径。

默认情况下,CMake能够处理以下构建类型:

  • 调试 :通常是经典的调试版本,包括调试信息,无需优化等。
  • 发布 :典型的发布版本,没有调试信息和完全优化。
  • RelWithDebInfo ::Release相同,但带有调试信息。
  • MinSizeRel :针对大小优化的特殊版本构建。

如何处理配置取决于正在使用的生成器。

某些生成器(如Visual Studio)支持多种配置。 CMake将立即生成所有配置,您可以从IDE中选择或使用--config CONFIG (使用cmake --build )选择要构建的配置。对于这些生成器,CMake将尽力生成构建目录结构,以使来自不同配置的文件不会相互衔接。

仅支持单个配置(如Unix Makefiles)的生成器的工作方式不同。这里当前活动的配置由CMake变量CMAKE_BUILD_TYPE 的值确定。

例如,要选择不同的构建类型,可以发出以下命令行命令:

cmake -DCMAKE_BUILD_TYPE=Debug path/to/source
cmake -DCMAKE_BUILD_TYPE=Release path/to/source
 

CMake脚本应避免设置CMAKE_BUILD_TYPE 本身,因为通常认为用户有责任这样做。

对于单配置生成器,切换配置需要重新运行CMake。后续构建可能会覆盖先前配置生成的目标文件。