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 ...
随机推荐
- iOS开发——UI篇OC篇&UIView/UIWindow/UIScreen/CALayer
UIView/UIWindow/UIScreen/CALayer 1.UIScreen可以获取设备屏幕的大小. 1 2 3 4 5 6 7 // 整个屏幕的大小 {{0, 0}, {320, 480} ...
- 【v2.x OGE教程 19】 引擎状态控制
1.手机button监听 OGE中提供了在BaseGameLauncher(GameLauncher的父类)和IScene(Scene实现的接口)中定义了onKeyUp和onKeyDown的方法.使得 ...
- PYTHON 源码阅读
http://www.wklken.me/posts/2015/09/29/python-source-gc.html http://www.wklken.me/archives.html https ...
- C++赋值运算符函数
为类添加赋值运算符函数: 类型定义 class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString ...
- 第1章 游戏之乐——NIM(2)“拈”游戏分析
NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若 ...
- java_线程安全-service
package com.demo.test; import java.util.Collections; import java.util.HashMap; import java.util.Map; ...
- The 7 Stages Of Scaling Web Apps--reference
reference from:http://highscalability.com/7-stages-scaling-web-apps TUESDAY, SEPTEMBER 23, 2008 AT 4 ...
- 小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy
四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结 ...
- 如何向Android模拟器打电话发短信
1. 启动Android Emulator, 查看标题栏找出端口.一般是android emulator(5554),其中5554就是端口. 2. 打开命令行,输入telnet localhost 5 ...
- linux云计算集群架构学习笔记:系统文件的目录结构
文件的基本管理和XFS文件系统备份恢复 1.1 Linux系统目录结构,相对/绝对路径. 1.2 创建/复制/删除文件,rm -rf / 意外事故 1.3 查看文件内容 1.4 xfs文件系统的备 ...