CMake 教你如何链接共享库

December 09, 2023
测试
测试
测试
测试
4 分钟阅读

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依赖的是静态库。

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多