前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CMake 教你如何链接共享库

CMake 教你如何链接共享库

作者头像
Rice加饭
发布2022-05-10 15:24:14
1.4K0
发布2022-05-10 15:24:14
举报
文章被收录于专栏:Rice嵌入式

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

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

《动态库链接》

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

代码语言:javascript
复制
$ tree -L 3
.
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    └── main.c

2 directories, 3 files
$

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

代码语言:javascript
复制
PROJECT(MAIN_TEST)

ADD_SUBDIRECTORY(src)

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

代码语言:javascript
复制
SET(TEST_SRC main.c)

ADD_EXECUTABLE(main ${TEST_SRC})

INCLUDE_DIRECTORIES(/usr/include/rice)
TARGET_LINK_LIBRARIES(main librice.so)

main.c的内容:

代码语言:javascript
复制
#include <rice.h>

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

编译运行(使用外部构建):

代码语言:javascript
复制
$ 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。指令描述如下:

代码语言:javascript
复制
INCLUDE_DIRECTORIES

指令

TARGET_LINK_LIBRARIES

语法

TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)

说明

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

《静态库链接》

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

修改src中的CMakeLists.txt文件:

代码语言:javascript
复制
将
TARGET_LINK_LIBRARIES(main librice.so)
修改为:
TARGET_LINK_LIBRARIES(main librice.a)

编译查看结果:

代码语言:javascript
复制
$ 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依赖的是静态库。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档