原文网址: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”头文件,并在运行时输出了版本号。