最基础的程序项目是通过对源码文件的构建产生可执行文件。对于简单的工程,你只需要在CMakeLists.txt文件中写入几行文本就足够了。这将是学习CMake的起点,CMakeLists.txt的文件内容与下面类似:
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable (Tutorial tutorial.cxx)
在上面的示例文件CMakeLists.txt中,使用的都是小写的英文字母。当然你也可以采用大写,或则大小写混合使用,CMake工具都是支持的。tutorial.cxx源文件的第一个版本如下,它会计算所给数值的平方根:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int main(int argc, char *argv[])
{
if (argc < 2) {
fprintf(stdout, "usage: %s number\n", argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout, "The square root of %g is %g\n",
inputValue, outputValue
);
return 0;
}
添加版本号并配置头文件
现在我们为我们的工程和程序添加一个版本号(Version number)。当然你也可以选择在源代码中这么做,但是将其定义在CMakeLists.txt中会更加灵活,特别是当项目越来越大时。现在为了添加版本号,我们将CMakeLists.txt文件修改成下面这样:
# Minimum version required
cmake_minimum_required(VERSION 3.0.0)
PROJECT(Tutorial)
# The version number
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
# configure a header file to pass some of the Cmake settings
# to the source code
configure_file(
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)
# add the binary tree to the search path for include file
# so that we will find TestConfig.h
include_directories("${PROJECT_BINARY_DIR}")
# add the executable
ADD_EXECUTABLE(tutorial tutorial.cpp)
先解释一下上面的两个东西,“PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR”,你可以把它们看做是两个常量量,它们是CMake系统内部已经定义好的。前者指代的是你的源码目录,后者指的是你的构建文件所在的目录,网上有部分人认为它们没有区别,其实是有的,主要看你的习惯。一般在使用CMake时,我们会新建一个名为build的文件夹,看起来像这样。
drwxrwxr-x 3 black black 4.0K 3月 18 13:23 build
-rw-rw-r-- 1 black black 539 3月 18 13:10 CMakeLists.txt
-rw-rw-r-- 1 black black 149 3月 18 11:58 TestConfig.h.in
-rw-rw-r-- 1 black black 602 3月 18 12:03 test.cpp
build为PROJECT_BINARY_DIR,而test.cpp文件所在的目录为PROJECT_SOURCE_DIR。但是你如果直接在test.cpp所在目录使用CMake命令进行初始化,那么上面的两个常量量指的就是同一个目录了。
现在再来看上面的CMakeLists.txt文件,我们先用set定义了两个常量,然后再添加configure_file(配置文件的命令),接着你需要将TutorialConfig.h文件的位置告诉CMake,也就是通过include_directories将所需目录包含。然后我们需要创建一个TutorialConfig.h文件(保存在source tree中,也就是和源码在同一目录),文件内容如下:
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
完成后,当CMake工具配置.in文件中@Tutorial_VERSION_MAJOR@和@Tutorial_VERSION_MINOR@的值时,会用在CMakeLists.txt文件中的值(Tutorial_VERSION_MAJOR即1和Tutorial_VERSION_MINOR即0)将它们两个替代,并在PROJECT_BINARY_DIR中生成一个TutorialConfig.h文件。接下来我们修改tutorial.cxx文件,让其包含配置头文件并使用version_number。修改后如下:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include "TutorialConfig.h"
using namespace std;
int main(int argc, char *argv[])
{
if (argc < 2) {
fprintf(stdout, "%s Version %d.%d\n",
argv[0],
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR
);
fprintf(stdout, "usage: %s number\n", argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout, "The square root of %g is %g\n",
inputValue, outputValue
);
return 0;
}
文件包含了TutorialConfig.h文件,并将version number作为使用消息输出。输出如下:
./Tutorial Version 1.0
usage: ./Tutorial number