参考
什么是CMake
CMake允许开发者编写一种平台无关的CMakeList.txt文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如Unix的Makefile或Windows的Visual Studio工程。从而做到“Write once,run everywhere”。CMake是一个高级编译配置工具,使用CMake作为项目架构系统的知名开源项目有VTK、ITK、KDE、OpenCV、OSG等。
在linux平台下使用CMake生成Makefile并编译的流程如下:
编写CMake配置文件CMakeLists.txt
执行命令cmake PATH或者ccmake PATH生成Makefile。PATH是CMakeLists.txt所在的目录。
使用 make 命令进行编译
文中涉及实例地址
单个源文件
源码地址
对于简单的项目,只需要写几行代码就可以了。例如,假设现在我们的项目中只有一个源文件 main.cc ,该程序的用途是计算一个数的指数幂。
#include
#include
/**
* power - Calculate the power of number.
* @param base: Base value.
* @param exponent: Exponent value.
*
* @return base raised to the power exponent.
*/
double power(double base, int exponent)
{
int result = base;
int i;
if (exponent == 0) {
return 1;
}
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
int main(int argc, char *argv[])
{
if (argc < 3){
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}
编写 CMakeLists.txt
首先编写 CMakeLists.txt 文件,并保存在与 main.cc 源文件同个目录下:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo1)
# 指定生成目标
add_executable(Demo main.cc)
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令不区分大小写。符号# 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
对于上面的 CMakeLists.txt 文件,依次出现了几个命令:
cmake_minimum_required:指定运行此配置文件所需的 CMake 的最低版本;
project:参数值是 Demo1,该命令表示项目的名称是 Demo1 。
add_executable: 将名为 main.cc 的源文件编译成一个名称为 Demo 的可执行文件。
编译项目
之后,在当前目录执行 cmake .,得到 Makefile 后再使用 make 命令编译得到 Demo1 可执行文件。
[root@localhost demo1]# cmake .
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /opt/shares/study/cmake/demo1
[root@localhost demo1]# make
Scanning dependencies of target Demo
[ 50%] Building CXX object CMakeFiles/Demo.dir/main.cc.o
[100%] Linking CXX executable Demo
[100%] Built target Demo
[root@localhost demo1]# ls
CMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt Demo main.cc Makefile
[root@localhost demo1]# ./Demo 5 4
5 ^ 4 is 625
多个源文件
源码地址
上面的例子只有单个源文件。现在假如把 power函数单独写进一个名为 MathFunctions.c的源文件里,使得这个工程变成如下的形式:
[root@localhost cmake]# tree demo2
demo2
├── main.cc
├── MathFunctions.cc
└── MathFunctions.h
0 directories, 3 files
main.cc
#include
#include
#include "MathFunctions.h"
int main(int argc, char *argv[])
{
if (argc < 3){
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}
MathFunctions.h
#ifndef POWER_H
#define POWER_H
extern double power(double base, int exponent);
#endif
MathFunctions.cc
/**
** power - Calculate the power of number.
** @param base: Base value.
** @param exponent: Exponent value.
**
** @return base raised to the power exponent.
**/
double power(double base, int exponent)
{
int result = base;
int i;
if (exponent == 0) {