前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CMake 静态库与动态库构建

CMake 静态库与动态库构建

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

在前面一篇文章写了如何使用CMake编译“hello world”。这一篇写写构建静态库和动态库。

上一文章链接:《CMake,大型项目采用的构建工具

对于静态库和动态库的了解,可以看看之前的文章:

静态库:《静态链接库的实现

动态库:《动态链接库的实现

在上一篇文章中,我们说了内部构建和外部构建的区别,接下来的例子我们使用外部构建。

我们在工程目录下建立CMakeLists.txt,lib目录,build目录。

CMakeLists.txt的内容如下:

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

ADD_SUBDIRECTORY(lib lib) #指定编译输出位置

在lib目录下建立源文件rice.c和rice.h,建立CMakeLists.txt文件。

rice.c的内容如下:

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

void rice_func()
{
        printf("rice func\n");
}

rice.h的内容如下:

代码语言:javascript
复制
#ifndef __RICE_H
#define __RICE_H

#include <stdio.h>

void rice_func();

#endif

CMakeLists.txt的内容如下:

代码语言:javascript
复制
SET(LIBRICE_SRC rice.c)

ADD_LIBRARY(rice STATIC ${LIBRICE_SRC})

制作库的工程模板制作好后,进行编译,在build目录下进行编译,如下:

代码语言:javascript
复制
$ cmake ..
省略。。。
$ make
省略。。。
$ cd lib
$ ls
CMakeFiles  cmake_install.cmake  librice.a  Makefile
$ 

编译完,在lib目录下生成了librice.a这个静态库。

在上面的CMakeLists.txt中,多了一个指令ADD_LIBRARY:

指令

ADD_LIBRARY

语法

ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)

说明

类型有三种:SHARED,动态库STATIC,静态库MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。EXCLUDE_FROM_ALL,参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

根据ADD_LIBRARY指令的描述,在上面的例子中,很清楚的理解是生成静态库的操作。

那么将上面的ADD_LIBRARY(rice STATIC {LIBRICE_SRC})替换成ADD_LIBRARY(rice SHARED {LIBRICE_SRC})编译生成的就是动态库。

安装共享库和头文件:只需要对lib文件夹下的CMakeLists.txt增加install指令,如下:

代码语言:javascript
复制
SET(LIBRICE_SRC rice.c)

ADD_LIBRARY(rice SHARED ${LIBRICE_SRC})

INSTALL(TARGETS rice LIBRARY DESTINATION lib)    #安装共享库
INSTALL(FILES rice.h DESTINATION include/rice)   #安装头文件

执行命令:

代码语言:javascript
复制
$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
省略。。。
$ make
省略。。。
$ make install
省略。。。

#查看共享库是否安装成功
/usr/lib$ ls librice.so 
librice.so
/usr/lib$

#查看头文件是否安装成功
/usr/include/rice$ ls
rice.h
/usr/include/rice$

可以看到,已经安装到指定的目录。

有写的不对的地方,欢迎找作者探讨。

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

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

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

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

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