主要内容:本文主要介绍了使用 cmake 编译和构建 C++ 程序的基础配置。所谓基础配置是指一个 CMakeLists.txt 文件通常需要包含哪些基本的要素能够构建出一个 C++ 程序。
官网教程所用到的文件可以在官网链接下载。
大部分项目是从源代码构建而来的可执行文件。对于简单的项目,三行CMakeLists.txt文件就能够满足要求。这是教程的起点。在Step1
目录中创建CMakeLists.txt文件,文件内容如下:
# 用于设置所允许的cmake最小版本号
cmake_mininum_required(VERSION 3.10)
# 设置项目的名字
project(Tutorial)
# 添加可执行文件
add_executable(Tutorial tutorial.cxx)
注意此 CMakeLists.txt
文件使用了小写形式的命令。cmake 支持大写、小写和大小写混合形式的命令。tutorial.cxx
是在Step1目录中的源代码文件,用于计算一个数的平方根。
所有需要做的就是构建和运行我们的项目。首先,运行cmake可执行命令或者cmake-gui来配置项目,然后用你所选择的构建工具构建项目。
例如,进入到cmake源代码树的所在目录Step1
,然后创建一个目录:
# mkdir Step1_build
之后,进入到Step1_build
目录(build目录),运行cmake来配置项目和生成原生的构建系统:
# cd Step1_build
# cmake ../Step1
然后调用构建系统来编译或链接这个项目:
# cmake —build ..
最后,执行以下 shell 命令使用刚构建的 Tutorial
:
./Tutorial 4294967296
指定c++标准
CMake 有一些特殊的变量用于构建项目代码。这些变量通常以 CMAKE_
开头。 CMAKE_CXX_STANDARD
和 CMAKE_CXX_STANDARD_REQUIRED
这两个变量用于指定项目所使用的 C++ 标准。
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
添加版本号和配置头文件
有时候我们想要在源代码中访问 CMakelists.txt
文件中定义的变量。实现这个需求的一种方式就是使用配置的头文件。我们在这个输入文件中定义多个需要被替换的变量,这些变量的语法是 @VAR@
。然后,使用 CMake 的 configure_file()
指令将输入拷贝到指定的输出文件,并且用 CMakelists.txt
文件中定义的变量 VAR
的真实值填充源代码文件中变量的值。简言之,就是用 CMakelists.txt
文件变量 VAR
的值去替换源代码文件中对应变量的值。
下面是完整的 CMakelists.txt
文件内容:
# TODO 1: Set the minimum required version of CMake to be 3.10
cmake_minimum_required(VERSION 3.10)
# TODO 2: Create a project named Tutorial
project(Tutorial VERSION 1.0)
# TODO 7: Set the project version number as 1.0 in the above project command
# TODO 6: Set the variable CMAKE_CXX_STANDARD to 11
# and the variable CMAKE_CXX_STANDARD_REQUIRED to True
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# TODO 8: Use configure_file to configure and copy TutorialConfig.h.in to
# TutorialConfig.h
configure_file(TutorialConfig.h.in TutorialConfig.h)
# TODO 3: Add an executable called Tutorial to the project
# Hint: Be sure to specify the source file as tutorial.cxx
add_executable(Tutorial tutorial.cxx)
# TODO 9: Use target_include_directories to include ${PROJECT_BINARY_DIR}
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}")
tutorial.cxx
文件当中的内容:
// A simple program that computes the square root of a number
#include <cmath>
// #include <cstdlib> // TODO 5: Remove this line
#include <iostream>
#include <string>
// TODO 11: Include TutorialConfig.h
#include <TutorialConfig.h>
int main(int argc, char* argv[])
{
if (argc < 2) {
// TODO 12: Create a print statement using Tutorial_VERSION_MAJOR
// and Tutorial_VERSION_MINOR
std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
<< Tutorial_VERSION_MINOR << std::endl;
std::cout << "Usage: " << argv[0] << " number" << std::endl;
return 1;
}
// convert input to double
// TODO 4: Replace atof(argv[1]) with std::stod(argv[1])
const double inputValue = std::stod(argv[1]);
// calculate square root
const double outputValue = sqrt(inputValue);
std::cout << "The square root of " << inputValue << " is " << outputValue
<< std::endl;
return 0;
}
TutorialConfig.h.in
文件当中的内容:
// the configured options and settings for Tutorial
// TODO 10: Define Tutorial_VERSION_MAJOR and Tutorial_VERSION_MINOR
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
需要注意的是,在我们使用 cmake 命令构建项目之前,在用编辑器编辑源文件 tutorial.cxx
时,会提示 TutorialConfig.h
头文件找不到。这时,需要清理 build
目录下的所有文件,然后在终端重新执行 cmake ..
和 make
命令。
测试程序的用法:
各位道友,码字不易,点个赞再走呗。