CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice. The suite of CMake tools were created by Kitware in response to the need for a powerful, cross-platform build environment for open-source projects such as ITK and VTK.

1. 简单文件结构和实现流程

我们使用的工程文件结构如下,工程文件夹名为 cmaketest

~/cmaketest $ tree
.
├── build
├── CMakeLists.txt
├── data
├── libs
├── result
└── src
└── main.cc

其中 main.cc 文件和 CMakeLists.txt 文件如下展示。 CMakeLists.txt 文件用于告诉 cmake 我们要对这个目录下的文件进行什么操作, CMakeLists.txt 文件的内容需要遵守 cmake 的语法。这里展示的一个最基本的用法,通过注释很容易理解。

 // cmaketest/src/main.cc
#include <iostream> using namespace std; int main(int argc, char** argv) { cout << "Hello world!" << endl;
return ;
}

main.cc

 # cmaketest/CMakeLists.txt for the project

 # 声明要求的 cmake 最低版本要求
cmake_minimum_required( VERSION 2.8 ) # 声明一个 cmake 工程
project( cmaketest ) # 添加一个可执行程序
# 基本语法:add_executable( 程序名 源代码文件 )
add_executable( cmaketest ./src/main.cc )

CMakeLists.txt

然后进入进行编译,注意由于我们的 CMakeLists.txt 文件在工程文件的一级目录下,而此时我们在二级目录 build 文件夹下,需要将路径设为 CMakeLists.txt 所在的路径,因此使用的 cmake .. 的命令。

cmake 会输出一些编译信息,然后在当前目录生成一些中间文件,其中最重要的是 Makefile。由于 Makefile 是自动生成的,我们不必修改它,直接 make 对工程进行编译即可。编译过程会输出一个编译进度,如果顺利通过,我们就可得到在 CMakeLists.txt 中声明的可执行文件 cmaketest ,在命令行输入可执行文件的文件名使其运行。

$ cd build
$ cmake ..
-- The C compiler identification is GNU 5.4.
-- The CXX compiler identification is GNU 5.4.
-- 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: /home/cv/cmaketest/build
$ make
Scanning dependencies of target cmaketest
[ %] Building CXX object CMakeFiles/cmaketest.dir/src/main.cc.o
[%] Linking CXX executable cmaketest
[%] Built target cmaketest
$ ./cmaketest
Hello world!

这里我们使用的cmake-make方式对工程进行编译,cmake过程处理了工程文件之间的关系,而make过程实际上调用了g++来编译程序,使得我们对项目的编译管理工作,从输入一串g++命令,变成了维护若干个比较直观的CMakeLists.txt文件,这明显降低了维护整个工程的难度。

而且当我们想要发布源代码时,一般都不希望把文件编译和运行的中间文件一并发布,因此我们这里建了一个名为build的目录,将编译和运行过程中产生的中间文件和缓冲文件与源代码很好地隔离开来,发布源码时,直接将改文件夹删掉即可,方便快捷。

2. 调用工程目录下子文件夹下的头文件

在libs文件夹下新建func.h和func.cc两个库文件,并在main.cc中调用其中定义的函数,三个文件的源代码内容如下。

~/cmaketest $ tree
.
├── build
├── CMakeLists.txt
├── data
├── libs
│   ├── func.cc
│   └── func.h
├── result
└── src
└── main.cc

其中main.cc以及func.h和func.cc文件内容如下所示。

Reference

[1] cmake 添加头文件目录,链接动态、静态库

CMKAE简单实用指南的更多相关文章

  1. Chrome 控制台实用指南【转】

    转自伯乐在线. Chrome 控制台实用指南 前言 Chrome浏览器我想是每一个前端er必用工具之一吧,一部分原因是它速度快,体积不大,支持的新特性也比其它浏览器多,还有一部分我想就是因为它的控制台 ...

  2. A Practical Guide to Distributed Scrum - 分布式Scrum的实用指南 - 读书笔记

    最近读了这本IBM出的<A Practical Guide to Distributed Scrum>(分布式Scrum的实用指南),书中的章节结构比较清楚,是针对Scrum项目进行,一个 ...

  3. webdriver实用指南python版本(1)-安装开发环境

    webdriver实用指南是本人编写的系列丛书,包括ruby版.python版和java版.在线版是免费的,之前是放在我的github上,但是很多同学总不记得地址,现在转到我的博客上,方便大家阅读. ...

  4. 乙醇的webdriver实用指南ruby版本

    webdriver实用指南是乙醇2013年分享计划的一部分,作为对已逝去的selenium2时代的追忆. 目录如下 启动浏览器 关闭浏览器 浏览器最大化 设置浏览器大小 访问链接 打印当前页面的tit ...

  5. 家用wifi信号覆盖增强扩展实用指南

    家用wifi信号覆盖增强扩展实用指南 现在网上很多号称穿墙王的无线路由器,但是一般用起来效果都不理想,其实最主要的原因还是家里面一般每个房间不大,但是墙比较多.并且一般也没有一个所谓的中心点放置路由器 ...

  6. kali中的APT软件包处理工具(apt-get)、Debian软件包管理器(dpkg)、源代码压缩和Nessus安装实用指南

    写在前面的话 能看懂此博客的朋友,深信你有一定的Kali基础了. 使用APT软件包处理工具(apt-get).Debian软件包管理器(dpkg)来维护.升级和安装自定义及第三方应用程序 APT软件包 ...

  7. 搜寻Linux软件实用指南

    搜寻Linux软件实用指南  对于初学者来说,仅仅安装好Linux系统还是不够的,还需要安装大量的应用软件.许多下载网站都提供了诸如装机必备软件的下载,分门别类提供经典的工具软件下载.本文主要针对初学 ...

  8. jQuery的几种简单实用效果

    许久未分享博客,或许已生疏. 闲来无事, 分享几个jQuery简单实用的效果案例 不喜勿喷... 1.页面常用的返回顶部 <!DOCTYPE html> <html lang=&qu ...

  9. 经验分享:10个简单实用的 jQuery 代码片段

    尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...

随机推荐

  1. JAVA 使用jgit管理git仓库

    最近设计基于gitops新的CICD方案,需要通过java读写git仓库,这里简单记录下. JGit是一款pure java的软件包,可以读写git仓库,下面介绍基本使用. 引入jgit maven引 ...

  2. Node6-2单元测试 覆盖率Istanbul

    Step1:安装Istanbul npm install -g istanbul Step2:在package.json里面添加,具体参考Istanbul的API写法 "scripts&qu ...

  3. springboot 使用阿里云短信服务发送验证码

    一.申请阿里云短信服务 1.申请签名 2.申请模板 3.创建accesskey(鼠标悬停在右上角头像) 二.代码实现 1.springboot引入maven依赖 <dependency> ...

  4. VS2019 开发Django(七)------VS2019不能格式化html代码

    如题,在VS2019中不能使用快捷键Ctrl+K,+D格式化html代码,印象中之前的版本是可以的吧!不太确定,这给我带来了很大的麻烦,在编写Django项目的时候,标准的模板是新建的html文件,不 ...

  5. 常见问题解决办法=》.net后台

    1:后台返回前端长度过大的问题 除了在web.config中设置最大值外还可以修改返回值  [web.config中配置最大值有时候无效,直接修改返回值效果会好一些] List<User> ...

  6. Jupyter 快捷键总结

    转载自https://www.cnblogs.com/hello-alan/p/11376325.htmlJupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文本: ...

  7. Vue增强

    1. Vue事件 语法:使用v-on指令注册事件 <标签 v-on:事件句柄="表达式或者事件处理函数"></标签> 简写方式:<标签 @事件句柄=& ...

  8. LAMPSecurity: CTF6 Vulnhub Walkthrough

    镜像下载地址: https://www.vulnhub.com/entry/lampsecurity-ctf6,85/ 主机扫描: ╰─ nmap -p- -sV -oA scan 10.10.202 ...

  9. Cocos Creator 资源加载流程剖析【六】——场景切换流程

    这里讨论场景切换的完整流程,从我们调用了loadScene开始切换场景,到场景切换完成背后发生的事情.整个流程可以分为场景加载和场景切换两部分,另外还简单讨论了场景的预加载. 加载场景的流程 load ...

  10. 第1章:C++泛型技术基础:模板——《C++泛型:STL原理和应用》读书笔记整理

    第1章:C++泛型技术基础:模板 1.2 关于模板参数 1.2.1 模板参数类型 类型参数   typename声明的参数都属于类型参数,它的实参必须为系统内置或者用户自定义的数据类型,包括类模板实体 ...