【CMake入门】第四节——静态库和共享库及安装、使用库的流程
系列文章:
【CMake入门】第一节——CMake的安装与简单样例
【CMake入门】第二节——CMake常用指令介绍
【CMake入门】第三节——构建项目并调用或生成库
静态库与共享库
静态库
- 原理:在编译时将源代码复制到程序中,运行时不用库文件依旧可以运行
- 优点:运行已有代码,运行时不再用库;无需加载库,运行更快
- 缺点:占用更多的空间和磁盘;静态库升级,需要重新编译程序
共享库
- 原理:编译时仅仅是记录用哪一个库里面的哪一个符号,不复制相关代码
- 优点:不复制代码,占用空间小;多个程序可以同时调用一个库;升级方便,无需重新编译
- 缺点:程序运行需要加载库,耗费一定时间
系统 | 静态库 | 共享库 |
---|---|---|
Windows | lib | .dll |
Linux | .a | .so |
Mac OS | .a | dylib |
安装库的流程
以Pangolin为例:
$ git clone https://github.com/stevenlovegrove/Pangolin.git
$ cd Pangolin
$ mkdir build
$ cd build
$ cmake
$ make -j4 #-j后面的数字表示make过程使用的cpu线程数,数字越大,速度越快,根据自己的电脑配置自行调整
$ sudo make install
$ #或者
$ #cmake ..
$ #make install #默认安装在/usr/bin
$ #make clean #可对构建结果进行清理
使用库的流程
当编译一个需要使用第三方库的软件时,我们需要知道:
- 去哪找头文件 .h
- 去哪找库文件 (.so/.dll/.lib/.dylib/…)
- 需要连接的库文件的名字
例如:需要第三方库curl,若不使用find命令,CMakeLists.txt需要指定头文件目录和库文件:
include_directiories(/usr/include/curl)
target_link_libraries(myprogram yourpath/curl.so)
若使用cmake的Module目录下的FindCURL.cmake,则CMakeLists.txt如下:
find_package(CURL REQUIRED)
include_directiories(${CURL_INCLUDE_DIR})
target_link_libraries(myprogram ${CURL_LIBRARY})