如果需要配置和检查我们工程中的所有依赖,那么可以选用CMake工具;但是,这并不是必须的,因为我们可以使用其他的工具或者是IDE(比如Makefiles或者Visual Studio)来配置我们的工程。然而,CMake是最好移植的方式来配置多平台的C++项目。

1. 基本用法

  CMake使用名称为CMakeLists.txt的文件,其中定义了编译和依赖处理等过程。对于一个基本的项目而言,从一个源码文件构建一个可执行程序只需要中CMakeLists.txt文件中添加两行代码即可。文件内容像下面这样:

cmake_minimum_required (VERSION 2.6)
project (CMakeTest)
add_executable (${PROJECT_NAME} main.cpp)

  文件的第一行定义了所需的CMake版本的最小值,这一行是强制添加在CMakeLists.txt文件中,其拥有指定了从第二行开始可以使用的给定版本所定义的cmake函数;第二行的project函数用于定义工程名(这里为CMakeTest),这个名字被保存在一个名为PROJECT_NAME的变量中。最后一行,在main.cpp文件中创建一个可执行命令(add_executable()),它的名字和工程名称(${PROJECT_NAME})相同,然后将源代码编译到名称为CMakeTest的可执行文件中,也就是将可执行文件名设置为与工程名相同。${}表达式允许访问环境中定义的任何变量,因此,我们可以使用${PROJECT_NAME}变量作为一个可执行程序的输出名。假设这里的main.cpp文件是一个简单的Hello World程序,代码如下:

#include <iostream>
using namespace std; int main(int argc, char *argv[])
{
cout << "Hello World! " << argc << argv[] << endl;
return ;
}

将这两个文件放置在同一目录下,然后依次执行如下命令:

cmake .
make

这样,我们就可以在当前目录下面看到一个名称为CMakeTest的可执行文件了。

2. 创建库文件(Creating a library)

  CMake允许你创建库文件,可以被OpenCV编译系统使用。软件开发过程中,在多个应用之间共享代码是一种通用并且实用的实践。在大型应用中,或者是当相同的代码在多个应用中共享时,这种使用方式非常有用。

  在这种情况下,我们不需要创建一个二进制可执行文件;取而代之,我们创建一个编译好的文件,其中包含了所有的函数、类等等,使用它来开发。我们可以将这个库文件与其它应用共享,而不需要共享我们的源代码。CMake中包含了一个add_library()函数来实现此目的:

# Create our hello library
add_library(Hello hello.cpp hello.h)
# Create our application that uses our new library
add_executable(executable main.cpp)
# Link our executable with the new library
target_link_libraries(executable Hello)

  以“#”开头的行为注释行,这些行会被CMake忽略掉。

  命令add_library(Hello hello.cpp hello.h)定义了我们新创建的库的名称,库名称为Hello,而hello.cpp和hello.h是库的源文件。我们添加头文件以允许IDE链接到这些头文件。执行这一行命令将会产生一个共享文件(在OS X或者Unix下生成一个*.so文件,在Windows下生成*.dll文件),这取决于我们所使用的操作系统,或者是要创建动态库还是静态库。

  target_link_libraries(executable Hello)用于链接我们的可执行文件executable到目标库,在这里,将会链接到Hello库中。

  假设我们在hello.cpp中定义一个say()函数用于输出字符串,在hello.h文件中添加此函数的声明:

 #include <iostream>
#include "hello.h" void say(std::string text)
{
std::cout << text << std::endl;
}

hello.cpp

#ifndef __HELLO_H__
#define __HELLO_H__
#include <string>
void say(std::string text);
#endif

hello.h

  然后,我们在main.cpp中添加hello.h头文件声明,然后引用Hello库中定义的say()函数,代码如下:

 #include "hello.h"

 int main()
{
say("I can say Hello!");
return ;
}

main.cpp

  最后,依次执行“cmake .”和“make”命令,就可以看到最终生成的可执行文件了,点击运行查看效果。

3. 管理依赖(Managing dependencies)

  CMake具有搜索我们的依赖文件以及外部库的能力,它为我们提供了编译复杂工程的基础设施,

4. 让脚本更复杂(Making the script more complex)

  在这一节,

CMake基础教程的更多相关文章

  1. CMake使用教程

    转自 RichardXG 原文 CMake使用教程 CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目. 通过编写CMak ...

  2. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  3. <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫

    并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...

  4. Memcache教程 Memcache零基础教程

    Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...

  5. Selenium IDE 基础教程

    Selenium IDE 基础教程 1.下载安装     a 在火狐浏览其中搜索附件组件,查找 Selenium IDE     b 下载安装,然后重启firefox 2.界面讲解      在菜单- ...

  6. html快速入门(基础教程+资源推荐)

    1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...

  7. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  8. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  9. oracle基础教程(8)oracle修改字符集

    oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...

随机推荐

  1. FZU 2169 shadow (用了一次邻接表存边,树形DP)

    Accept: 28 Submit: 97 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description YL是shadow国的国 ...

  2. ios开发——实用技术篇Swift篇&系统声音

    系统声音 // MARK: - 系统声音 /*----- 系统声音 ------*/ @IBAction func systemSound() { //建立的SystemSoundID对象 var s ...

  3. js判断图片是否显示

    function getDefaultImg() { //添加判断图片是否存在操作 var $defaultImgPathObj = $('input[name=defaultImgPath]'); ...

  4. SAP ABAP程序下载器(增强版)

    在实际的项目中运用过几次 Mass download 这个程序,发现下载ABAP代码还真是利器,目前最新的版本是1.4.4,已经n年没有更新过了.使用过程中,发现其导出的HTML格式的代码有问题,包括 ...

  5. QTP自学攻略

    QTP自学攻略 自学总是很痛苦的,看大量的书籍,可是学到的东西却不是那么实用,下面整理了一些在QTP中经常需要的函数,以及方法很实用!  QTP常用函数  1, 获取对话框相应的文字: GetVisi ...

  6. css笔记19:浮动的案例

    案例一: 1. 首先是01.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  7. Simple Membership 学习笔记

    第一步:新建项目后添加对WebMartix.Data 和 WebMatrix.WebData的引用第二步:在web.config中添加membership配置节第三步:修改Global.asax文件 ...

  8. ASP.NET MVC 4 批量上传文件

    上传文件的经典写法: <form id="uploadform" action="/Home/UploadFile" method="post& ...

  9. Selector中的各种状态详解

    今天弄这个selector把脑壳弄得清痛,最终我的理解如下: 官方关于这个的介绍在:http://developer.android.com/guide/topics/resources/drawab ...

  10. P6Spy 、 SQL Profiler

    P6Spy 在优化Hibernate性能的时候,很重要的一点就是要看到Hibernate底层执行的SQL 虽然通过打印日志配合Hibernate的show_sql属性能够拼凑出Hibernate底层执 ...