Learn CMake(3)--创建库文件

介绍如何用CMake编译生成动态链接库和静态链接库。

静态库和动态库的区别

静态链接库(STATIC)和动态链接库(SHARED)

建立动态链接库(.so/.dll)

我们把上一个示例中的HelloWorld类编译成动态链接库。
文件目录如下:

1
2
3
4
5
6
7
8
9
aincrad@Inspiron:~/Desktop/HelloWorld$ tree
.
├── CMakeLists.txt
├── include
│   └── HelloWorld.h
└── src
└── HelloWorld.cpp

2 directories, 3 files

由于目标是建立库,而不是生成可执行文件,所以我们不需要main.cpp

下面是CMakeLists.txt中的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cmake_minimum_required(VERSION 3.5.1)
project(HelloWorld_lib)
set(CMAKE_BUILD_TYPE Release)

#Bring the headers, such as HelloWorld.h into the project
include_directories(include)

#However, the file(GLOB ...) allows for wildcard additions:
file(GLOB SOURCES "src/*.cpp")

#Generate the shared library from the sources
add_library(HelloWorld SHARED ${SOURCES})

#Set the location for library installation -- i.e., /usr/lib in this case
# not really necessary in this example. Use "sudo make install " to apply
install(TARGETS HelloWorld DESTINATION /usr/lib)

解释CMakeLists.txt中新出现的内容:

  • set(CMAKE_BUILD_TYPE Release)表示此次编译为正式发布版本。另外还有Debug等模式。这个参数决定了在编译时进不进行优化或者包不包含debug信息。详细参见Build types in CMake
  • add_library()和之前的add_executable()类似。不过是用来创建库文件的,SHARED参数表明这是一个动态库(其它选项:STATIC or MODULE)。
  • install()指定了库的安装位置。使用sudo make install来激发,用来把链接库安装到系统中。

下面是具体的编译命令:

1
2
3
4
5
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

成功编译后会在build文件夹里生成库文件libHelloWorld.so,使用sudo make install安装成功后的信息:

1
2
3
4
5
aincrad@Inspiron:~/Desktop/HelloWorld/build$ sudo make install
[100%] Built target HelloWorld
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/lib/libHelloWorld.so

建立静态链接库(.a/.lib)

编译静态库和编译动态库的方式几乎完全一样,唯一的区别就是把add_library()中的SHARED参数改成STATIC

参考链接

Introduction to CMake by Example
Jermmy’s Lazy Blog–cmake学习笔记