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。指令描述如下:
指令 | I |
语法 | 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依赖的是静态库。