linux cmake 清理缓存,CMake整理

本文详细介绍了Linux环境下使用CMake构建项目的过程,包括编写CMakeLists.txt,执行cmake和make命令,以及如何清理CMake缓存。同时,文章讨论了多源文件项目管理,自定义编译选项,添加测试和环境检查的方法。最后提到了如何通过CPack生成安装包以及将其他平台项目迁移到CMake。
摘要由CSDN通过智能技术生成

参考

什么是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) {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值