cmake的使用和库的使用

最近在看高翔博士的《SLAM十四讲》,这本书真是太棒啦,以前对于cmake的使用和C++库的理解一直不是很清楚,看完第二讲基本上就搞清楚啦。为了更好地记住知识,做一下输出。

本文使用人员,对于cmake和c++有初步了解,知道cmake、makefile和C++源码之间的关系

1. cmake的使用

1.1 典型cmake工程的文件目录结构

.
├── build
├── CMakeLists.txt
└── main.cpp

[注]在编译之前,build文件夹为空,编译的内容一般放在build文件夹下

典型的CMakeLists.txt文件用于告诉cmake要对这个目录下的文件做什么事情

# 声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )
 
# 声明一个cmake工程
project( HelloSLAM )

# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( mian mian.cpp )

[注]main.cpp内容如下:

#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
    cout << "hello world" << endl;
    return 0;  
}

1.2 编译方法

$ cd build        // 
$ cmake ..      // 调用cmake对该工程进行cmake编译,编译到build文件夹下
// cmake会输出一些编译信息,在build文件夹下生成一些中间文件,其中最重要的是MakeFile,即自动化编译脚本
$ make          //用make命令对工程进行编译,将会在build文件夹下生成一个可执行文件main
$ ./main        //执行可执行程序 

借助cmake可以很好地解决各种依赖关系

2. C++库的使用

在一个c++工程中,并不是所有代码都会编译程可执行文件。只有带有main函数的文件才会生成可执行程序。而另一些代码,将被打包成一个东西,供其他程序调用。

在linux中,库文件分成静态库和共享库两种。静态库以.a结尾,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本
[注]这里只谈到共享库

2.1 使用cmake生成共享库
一个共享库的工程文件内容如下:

.
├── build
├── CMakeLists.txt
├── testLib.h      //头文件
└── testLib.cpp

testLib.cpp文件内容如下:

#include <iostream>
using namespace std;
void testLib()
{
    cout << "this is a library file" << endl;
    return 0;
}

CMakeList.txt文件内容如下:

# 声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )
 
# 声明一个cmake工程
project( TestLib )

add_library( testLib SHARED testLib.cpp )

编译过程如1.1,得到库文件testLib.so

2.2 头文件
库文件是一个压缩包,里面有编译好的二进制函数。为了方便别人使用这个库,需要提供一个头文件,说明库里都有些什么。testLib.h头文件如下:

#ifndef LIBTESTLIB_H_
#define LIBTESTLIB_H_
// 上面的宏定义是为了防止重复引用这个头文件而引起额重定义错误

// 提示库文件的函数
void testLib();          // 记得分号

2.3 库文件调用
根据头文件和编译得到的库文件,我们可以通过可执行程序来调用这个函数。项目工程如下:

.
├── build
├── CMakeLists.txt
└── useLib.cpp

useLib.cpp如下

#include “testLib.h”    // 引用头文件,使用testLib()函数

int main(int argc, char **argv)
{
    testLib();
    return 0;
}

CMakeLists.txt中添加一个可执行程序的生成命令,链接到刚才使用的库上。内容如下如下:

# 声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )
 
# 声明一个cmake工程
project( UseLib )
target_link_libraries( useLib testLib )

# 添加一个可执行程序
add_executable( useLib useLib.cpp )
# 链接库文件到对应的可执行文件上
target_link_libraries( useLib testLib )

[注]链接对应的库文件到对应的可执行文件时,一定要指定对应的路径,如果库文件不在对应的build目录下,需要指定目录:target_link_libraries( useLib [PATH]/testLib )

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容