CMake一个简洁的构建工具,让我们省去了设计复杂的Makefile。在之前作者已经整理了两篇相关文章,如下:
- 《CMake,大型项目采用的构建工具》
- 《CMake 静态库与动态库构建》
今天的文章是基于上一篇的文章的写到的工程继续扩展的,如果对CMake制作动态库和静态库不是很了解的小伙伴,建议先看一下上一篇文章的描述。
《动态库链接》
在上一节中我们制作了一个librice.so的动态库,并进行了安装,所以我们直接使用这个动态库。接下来弄一个例程来讲解如何链接动态库,例程结构如下:
$ tree -L 3
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
└── main.c
2 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 <rice.h>
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 sample
rice func
$
可以看到可执行文件main链接了动态库rice。
在上面CMakeLists.txt文件中,有两个新的指令:INCLUDE_DIRECTORIES和TARGET_LINK_LIBRARIES。指令描述如下:
INCLUDE_DIRECTORIES
指令 | TARGET_LINK_LIBRARIES |
---|---|
语法 | TARGET_LINK_LIBRARIES(target library1 <debug | optimized> 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 sample
rice func
$
有上面的结果看,mian依赖的是静态库。