文章目录

  • 1 什么是CMake
  • 2 单个源文件编译
    • 2.1 编写单个cpp文件
    • 2.2 编写CMakeLists.txt
    • 2.3 使用`cmake .`和`make`编译项目
      • 2.3.1 执行`cmake .`
      • 2.3.2 执行`make`
      • 2.3.3 执行`./`运行测试
  • 3 CMake使用详解二(多文件编译)

1 什么是CMake

你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等 。

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  1. 编写 CMake 配置文件 CMakeLists.txt 。
  2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile 。其中, PATH 是 CMakeLists.txt 所在的目录。
  3. 使用 make 命令进行编译。

2 单个源文件编译

2.1 编写单个cpp文件

假设现在我们的项目中只有一个源文件main.cpp,该程序的用途是计算一个数的指数幂,新建这个cpp文件

$ cd
$ mkdir mathPowerDemo
$ cd mathPowerDemo
$ gedit main.cpp

键入代码如下

#include <stdio.h>
#include <stdlib.h>
/*** 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;
}

2.2 编写CMakeLists.txt

首先编写CMakeLists.txt文件,并保存在与main.cpp源文件同个目录下:

$ gedit CMakeLists.txt

CMakeLists.txt中输入:

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (mathPowerDemo)
# 指定生成目标
add_executable(mathPowerDemo main.cpp)

CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

对于上面的 CMakeLists.txt 文件,依次出现了几个命令:

  1. cmake_minimum_required:指定运行此配置文件所需的 CMake 的最低版本;
  2. project:参数值是 mathPowerDemo,该命令表示项目的名称是 mathPowerDemo
  3. add_executable: 将名为 main.cpp的源文件编译成一个名称为 mathPowerDemo 的可执行文件。

此时文件夹目录下有如下两个文件:

2.3 使用cmake .make编译项目

2.3.1 执行cmake .

在当前目录执行 cmake . ,得到 Makefile

此时文件夹下面多了3个文件,分别是CMakeCache.txtcmake_install.camkeMakefile

和1个文件夹/CMakeFiles,里面有很多cmake相关的文件。

2.3.2 执行make

再使用 make 命令编译得到 mathPowerDemo 可执行文件。

此时文件夹下又多了一个可执行文件’mathPowerDemo’。

2.3.3 执行./运行测试

计算9的平方

$ sudo chmod 777 mathPowerDemo
$ ./mathPowerDemo 9 2

得到结果:81

3 CMake使用详解二(多文件编译)

我的下一篇博客:CMake使用详解二(多文件编译)

# 参考文献:

  1. CMake入门实战
  2. CMake学习

CMake使用详解一(单文件编译)相关推荐

  1. vue单文件props写法_详解Vue 单文件组件的三种写法

    详解Vue 单文件组件的三种写法 JS构造选项写法 export defaul { data, methods, ...} JS class写法 @Component export default c ...

  2. CMake使用详解二(多文件编译)

    文章目录 1 同一目录,多个源文件 1.1 创建2个源文件 1.2 编写CMakeLists.txt 1.3 编译项目 2 多个目录,多个源文件 2.1 在不同的目录下新建源代码 2.2 编写CMak ...

  3. 详解LAMP源码编译安装

    实战:LAMP源码编译安装 家住海边喜欢浪:zhang789.blog.51cto.com 目录 详解LAMP源码编译安装 LAMP简介 一.准备工作 二.编译安装 Apache 三.编译安装 MyS ...

  4. CMake 手册详解(五)

    CMake 手册详解(五) CMD#2: add_custom_target 添加一个目标,它没有输出:这样它就总是会被构建. add_custom_target(Name [ALL] [comman ...

  5. CMake手册详解 (十二)

    2019独角兽企业重金招聘Python工程师标准>>> SirDigit CMake手册详解 (十二) CMD#30:find_library查找一个库文件 find_library ...

  6. 实验详解——parted单磁盘分区并进行配额

    实验详解--parted单磁盘分区并进行配额 一.实验要求 二.实验开始 1.添加新硬盘 2.对新硬盘进行parted分区,格式设置为ext4 3.格式化分区,格式为ext4 4.设置配额方式和挂载 ...

  7. 详解S60 WebKit 21772编译教程

    S60 WebKit 21772编译教程是本文要介绍的内容,主要是来了解并学习S60 WebKit应用,具体内容的学习来看本文详解. 1.安装环境: perl jdk S60-SDK-0548-3.0 ...

  8. CMake 手册详解(十八)

    2019独角兽企业重金招聘Python工程师标准>>> SirDigit CMake 手册详解(十八) CMD#45 : include从给定的文件中读取CMake的列表文件. in ...

  9. CMake手册详解 (十四)

    2019独角兽企业重金招聘Python工程师标准>>> SirDigit CMake手册详解 (十四) CMD#32 : find_path搜索包含某个文件的路径 find_path ...

最新文章

  1. 实对称矩阵的性质_浅谈矩阵的相似对角化(一)
  2. Jupyter中打印所有结果的解决办法
  3. java实现ldap服务器_Java到LDAP教程(包括如何安装LDAP服务器/客户端)
  4. Linux的vi命令
  5. 盲审不到4分的论文竟中了ICLR 2019??!!ICLR 2019官方这样回应
  6. 7-160 找完数 (20 分)
  7. python selenium --一些常用方法
  8. C++——oop思想
  9. NetLimiter(网络限速-对付流氓上传)
  10. 一元三次方程通用求解方法
  11. 公司/企业如何管理?管理技巧是什么?《宁向东管理学课》音频资料免费下载
  12. select * from a,b用法
  13. [Python]PEP8 编码规范及开发中的一些惯例和建议
  14. linux执行scp命令出错
  15. 少儿编程是不是智商税
  16. 【今日CV 计算机视觉论文速览 第128期】Mon, 10 Jun 2019
  17. linux 怎样安装 nginx
  18. 安全模式怎么更改计算机用户,电脑怎么关闭安全模式步骤详解
  19. 神经网络学习小记录45——Keras常用学习率下降方式汇总
  20. 记录第一次因为技术出差(自嘲一番吧)

热门文章

  1. STM32工作笔记0096---用sprintf分配内存
  2. STM32工作笔记0032---编写跑马灯实验---寄存器版本
  3. Linux学习笔记015---Centos关机命令
  4. APPCAN学习笔记005---AppCan IDE安装下载,AppCan IDE启动
  5. 云计算学习笔记002---云计算的理解及介绍,google云计算平台实现原理
  6. 1004 C语言设置测试数据个数和测试结束标志
  7. 排列组合算法之一: 01转换法_java改变后的c++版
  8. 一步一步写算法(之图的保存)
  9. java健康检查的作用,spring cloud分布式健康检查
  10. 磁盘移臂调度实验_10 Swarm 的安装和基本的服务编排调度