CMake基础教程
如果需要配置和检查我们工程中的所有依赖,那么可以选用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基础教程的更多相关文章
- CMake使用教程
转自 RichardXG 原文 CMake使用教程 CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目. 通过编写CMak ...
- matlab基础教程——根据Andrew Ng的machine learning整理
matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...
- <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫
并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...
- Memcache教程 Memcache零基础教程
Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...
- Selenium IDE 基础教程
Selenium IDE 基础教程 1.下载安装 a 在火狐浏览其中搜索附件组件,查找 Selenium IDE b 下载安装,然后重启firefox 2.界面讲解 在菜单- ...
- html快速入门(基础教程+资源推荐)
1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...
- 转发-UI基础教程 – 原生App切图的那些事儿
UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...
- 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...
- oracle基础教程(8)oracle修改字符集
oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...
随机推荐
- jQuery Pagination Ajax分页插件中文详解(转)
一.相关demo 基本demo页面 Ajax demo页面 参数可编辑demo页面 二.简介与说明 此jQuery插件为Ajax分页插件,一次性加载,故分页切换时无刷新与延迟,如果数据量较大不建议用此 ...
- Java多线程中start()和run()的区别
Java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thread对象所对应的方 ...
- Debian下MySQL配置
1 安装 $ apt-get install mysql-server $ apt-get install mysql-client 2 修改MySQL的口令 一般上一步会让你输入root密码,如果没 ...
- QTP 中对象操作
1.创建对象(将浏览器设置为一个对象) set oIE=createobject("internetexplorer.application") 2.将浏览器设置为可见的 oIE. ...
- 视频播放-VideoVIew,Vitamio
播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView类来实现的.这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器.VideoView的用法和 Med ...
- 并发MD5计算方法
MD5与SHA算法一样,利用他们可以计算某段数据的唯一hash值,常用做校验码.而MD5比SHA算法性能高.在我参加的一个项目中,主要用MD5码值来去重,因此对计算性能要求较高.网上有对MD5算法并行 ...
- 封装SqliteHelper类--Sqlite数据库
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- 新增html元素的使用
今天学习HTML5中新增元素的使用 (Ⅰ)新增主体结构元素 Section元素:用于对网站或应用程序中的内容进行分块. <section> <h1></h1> &l ...
- jquery jsonp实现跨域
html代码: $("#testJsonp").click(function(){ $.ajax({ url: "http://www.test.cc/1.php&quo ...
- 实用工具推荐(Live Writer)(2015年05月26日)
1.写博客的实用工具 推荐软件:Live Writer 使用步骤: 1.安装 Live Essential 2011,下载地址:http://explore.live.com/windows-live ...