CMake一个简洁的构建工具,让我们省去了设计复杂的Makefile。在之前作者已经整理了两篇相关文章,如下:

  • 《CMake,大型项目采用的构建工具》
  • 《CMake 静态库与动态库构建》

今天的文章是基于上一篇的文章的写到的工程继续扩展的,如果对CMake制作动态库和静态库不是很了解的小伙伴,建议先看一下上一篇文章的描述。

《动态库链接》

在上一节中我们制作了一个librice.so的动态库,并进行了安装,所以我们直接使用这个动态库。接下来弄一个例程来讲解如何链接动态库,例程结构如下:

$ tree -L 3.├── build├── CMakeLists.txt└── src    ├── CMakeLists.txt    └── main.c2 directories, 3 files$

工程目录的CMakeLists.txt文件内容:

PROJECT(MAIN_TEST)ADD_SUBDIRECTORY(src)

src目录的CMakeLists.txt文件内容:

SET(TEST_SRC main.c)ADD_EXECUTABLE(main ${TEST_SRC})INCLUDE_DIRECTORIES(/usr/include/rice)TARGET_LINK_LIBRARIES(main librice.so)

main.c的内容:


#include int main(int argc, char *argv[]){    printf("test sample\n");    rice_func();    return 0;}

编译运行(

使用外部构建):

$ cmake ..#省略....$ make#省略.....#查看main的链接情况$ ldd src/main         linux-vdso.so.1 =>  (0x00007ffecf33a000)        librice.so => /usr/lib/librice.so (0x00007f5754a69000)        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f575469f000)        /lib64/ld-linux-x86-64.so.2 (0x00007f5754c6b000)$ ./main test samplerice func$

可以看到可执行文件main链接了动态库rice。

在上面CMakeLists.txt文件中,有两个新的指令:INCLUDE_DIRECTORIES和TARGET_LINK_LIBRARIES。指令描述如下:

指令

INCLUDE_DIRECTORIES

语法

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

说明

用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的后面,你可以通过两种方式来进行控制搜索路径添加的方式:

1 CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件搜索路径放在已有路径的前面。

2 通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。

指令

TARGET_LINK_LIBRARIES

语法

TARGET_LINK_LIBRARIES(target library1 library2

                                       ...)

说明

该指令可以用来为 target 添加需要链接的共享库

《静态库链接》


静态库链接只需要在上面的例子中修改一点点内容就可以了。如下:

修改src中的CMakeLists.txt文件:

将TARGET_LINK_LIBRARIES(main librice.so)修改为:TARGET_LINK_LIBRARIES(main librice.a)

编译查看结果:


$ ldd ./src/main         linux-vdso.so.1 =>  (0x00007ffead3ec000)        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f75fcb16000)        /lib64/ld-linux-x86-64.so.2 (0x00007f75fcee0000)$ ./main test samplerice func$

有上面的结果看,mian依赖的是静态库。

cmakelists 链接mysql cmake 链接so库_.so 依赖目录 cmake