CMake 简明教程(1)---第一个例子

时间:2022-08-31 19:57:03

原文网址:http://cmake.org/cmake/help/cmake_tutorial.html

教程中所有的代码都可以在这里找到:http://public.kitware.com/cgi-bin/viewcvs.cgi/CMake/Tests/Tutorial/



工作中总是免不了要使用cmake,这真是一个神器啊,简单易用,跨平台。但之前没有好好学习它,这次将官网的教程翻译,之后再将自己实际使用时遇到的问题添加上。


第一个例子是从源代码编译出可执行文件。对于简单的例子,一个两行cmake脚本的CMakeLists.txt 文件就够了。这就是整个cmake教程的起点。这个CMakeLists.txt代码如下:

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cxx)


这里强调下project()函数的作用,project()函数相当启用一些新变量如:

PROJECT_SOURCE_DIR, <PROJECT-NAME>_SOURCE_DIR  //两个变量内容相同
PROJECT_BINARY_DIR, <PROJECT-NAME>_BINARY_DIR //两个变量内容相同
还有,但之下几个变量需要在 CMP0048 设置为NEW时考生

PROJECT_VERSION, <PROJECT-NAME>_VERSION                      //两个变量内容相同
PROJECT_VERSION_MAJOR, <PROJECT-NAME>_VERSION_MAJOR // ..
PROJECT_VERSION_MINOR, <PROJECT-NAME>_VERSION_MINOR // ..
PROJECT_VERSION_PATCH, <PROJECT-NAME>_VERSION_PATCH // ..
PROJECT_VERSION_TWEAK, <PROJECT-NAME>_VERSION_TWEAK // ..




需要说明的是本教程中的函数全部使用小写。cmake不区分大小写。教程中的tutorial.cxx文件的代码用于计算实数的平方根,它的初始代码如下:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
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;
}

添加版本号和用于配置的头文件

接下来我们会为我们代码和可执行文件添加版本号。当然你可以在代码文件中依次添加,但使用cmake文件添加要灵活得多。要添加版本号,CMakeLists.txt文件内容大致如下:

cmake_minimum_required (VERSION 2.6)
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
# 之后cmake会根据这一行,在将”Tutorial.Config.h.in”复制为"${PROJECT_BINARY_DIR}/TutorialConfig.h”时,配置”Tutorial.Config.h”中的一些内容
configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)

# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
include_directories("${PROJECT_BINARY_DIR}")

# add the executable
add_executable(Tutorial tutorial.cxx)

因为配置文件的内容会被写入编译出的文件中,我们必须告诉cmake这些文件的路径。我们在代码目录中新建一个名为“TutorialConfig.h.in”的文件,并在其中添加如下两行:

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@ // 在使用cmake配置代码工程时被替换,使用编译器编译之前已经成为了正常的c代码
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

当cmake为头文件配置“@Tutorial_VERSION_MAJOR@” and “@Tutorial_VERSION_MINOR@”两个值时,会从CMakeLists.txt中找到相应的值来替换配置文件中对应行。接下来,我们修改”Tutorial.cxx”文件,让它include配置头文件,并让它使用版本号。修改后的”Tutorial.cxx”内容如下:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"

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;
}

主要的变化是include 了 “TutorialConfig.h”头文件,并在运行时输出了版本号。