欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【CMake】编译可执行文件

程序员文章站 2022-06-30 10:48:21
...

项目结构

.
├─app
│  ├─CMakeLists.txt
|  └─main.cpp
└─CMakeLists.txt

配置项目

在当前目录下的 CMakeLists.txt为整个项目做一些基本配置,包括项目所需CMake最低版本、项目名称、编译器等,文件内容如下

# ./CMakeLists.txt
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(Compile_Executable_File LANGUAGES CXX)
add_subdirectory(app)

cmake_minimum_required 规定构建当前项目的所需CMake的最低版本,当构建项目使用的CMake不满足做个最低版本要求,则会出现报错,添加 FATAL_ERROR 则在不满足条件的情况下产生致命报错

cmake_minimum_required(VERSION 3.5)
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

CMake语法不区分大小写(即 cmake_minimum_requiredCMAKE_MINIMUN_REQUIRED 是一样的),但是参数区分大小写的

project 声明项目名称(Compile_Executable_File),同时也可以添加参数 LANGUAGES 来显式声明项目的编程语言

project(Compile_Executable_File)
project(Compile_Executable_File LANGUAGES CXX)

CXX代表C++,C++是CMake默认的编程语言

完成对整个项目的基本配置,我们就可以添加子目录 add_subdirectory 来进行编译,我们添加子目录 app 来编译可执行文件

add_subdirectory(app)

配置编译可执行文件

app/CMakeLists.txt 配置编译可执行文件

设置可执行文件输出路径 EXECUTABLE_OUTPUT_PATH${PROJECT_SOURCE_DIR}/bin

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

PROJECT_SOURCE_DIR 是一个默认的变量,这个变量是和根目录下的 CMakeLists.txt 相同目录,或者说是与包含了设置项目名称 project()CMakeLists.txt 目录是相同的

add_executable 将通过编译源文件 main.cpp 来创建一个可执行文件 compile-executable_file(.exe)

add_executable(compile-executable_file main.cpp)
add_executable(${PROJECT_NAME} main.cpp)

你也可以指定输出的名称为项目名称 ${PROJECT_NAME} ,也就是在 project() 指定的项目名称

编写完项目的全部 CMakeLists.txt 文件后,接下来就是如何构建并且编译项目

构建项目和生成构建器

CMake是一个构建系统生成器。将描述构建系统(如:Unix Makefile、Ninja、Visual Studio等)应当如何操作才能编译代码。然后,CMake为所选的构建系统生成相应的指令。默认情况下,

  • GNU/Linux和macOS系统上,Unix Makefile 是默认的生成器
  • Windows上,Visual Studio 是默认的生成器

使用CMake配置项目并生成构建器 (generator) ,我们可以通过命令行界面 (CLI) 进行,也可以通过GUI进行。CMake CLI 提供了许多选项,可以通过 cmake -h 查看。

在根目录下,新建目录 build 并且进入该目录,在 build 目录下,通过指定上级目录的 CMakeLists.txt 来调用 CMake 配置项目并生成构建器

mkdir -p build
cd build
cmake ..
# or specify a generator available the platform
cmake .. -G "MinGW Makefiles"

你可以直接在项目根目录下中执行 cmake .,这是源代码内构建,但是这种做法会在根目录(源代码目录)下生成配置文件,会将源代码和项目的生成树混合,这是非常不推荐的。我们依然会选择源外(out of source)构建项目,即新建目录 build ,并且在目录 build 下构建。

你可以看到这里使用了参数 -G 来指定生成器为 "MinGW Makefiles" (需要有双引号),你可以通过 cmake -h 来查看全部可用的生成器。

当出现如下输出,则已经成功配置项目(Configuring done),并且生成了构建器(Generating done)

-- Configuring done
-- Generating done

你可以在 build 目录下,看到下列文件:

.
├─CMakefiles
├─cmake_install.cmake
├─CMakeCache.txt
└─Makefile
  • CMakefiles :临时文件目录,CMake用于检测操作系统、编译器等。
  • cmake_install.cmake :处理安装规则的CMake脚本,在项目安装时使用。
  • CMakeCache.txt :如文件名所示,CMake缓存。CMake在重新运行配置时使用这个文件。
  • Makefile : 命令 make 将运行指令来编译项目。

编译项目

随后就可以开始编译可执行文件

make
# or
cmake --build .

生成的项目就会在 ${PROJECT_SOURCE_DIR}/bin 下,也就是 bin。如果不通过 set(EXECUTABLE_OUTPUT_PATH ...) 来指定输出目录,那么文件会被输出到 build 目录下