动静态库的制作与使用(Linux操作系统)

embedded/2025/1/24 15:26:23/

一、静态库制作

首先准备好需要做成库的源文件与头文件,如下示例:

注意:在制作库方法过程中不能有main函数。 

如果代码是用c语言进行写的,执行以下语句把所有.c文件进行编译得到了.o文件。 

gcc -c *.c

使用ar指令把所有.o文件链接成静态库,如下: 

ar -rc libmyc.a *.o
  • -r(replace):此选项表示在插入文件到库时,若遇到同名的成员,则进行替换。它确保了库中的文件是最新的。

  • -c(create):这个选项用于创建一个新的库文件。如果指定的库文件已经存在,它并不会被覆盖,而是会报错提示文件已存在。

        注意:在静态库命名时开头必须是lib,结尾必须是 .a 中间的才是它真正的名字,比如这里的myc。

这样动态库就制作完了,即libmyc.a。

二、动态库制作

        源文件头文件不变,在生成静态库之后.o文件就没有用了我们把删除(rm *.o),以免干扰下面操作,重新生成.o文件并带-fPIC选项:

gcc -c -fPIC *.c

fPIC:产⽣位置⽆关码(position independent code),这里先不做过多追究。

gcc提供了制作动态库的选项:-shared,如下生成动态库:

gcc -shared *.o -o libmyc.so

         注意:在动态库命名时开头必须是lib,结尾必须是 .so 中间的才是它真正的名字,比如这里的myc。

三、动静态库打包

        我们把库和头文件分别装入一个相同的新建目录,例如这里新建立mylib1和mylib2,然后分别创建include拿来放头文件,创建lib拿来放库文件。结构如下:

使用tar指令打包。 

tar czf mylib1.tgz mylib1
tar czf mylib2.tgz mylib2

然后得到mylib1.tgz(静态库),mylib2.tgz(动态库),就可以把它们分享给好朋友使用了。

四、静态库使用

我们创建一个zhangsan目录模拟我们的好朋友张三,并把打包好的库给他,如下:

然后进行解包,如下指令: 

tar xzf mylib1.tgz
tar xzf mylib2.tgz

然后我们生成可执行文件时需要带以下选项,才能让系统找到库:

-I:指定头⽂件搜索路径
-L:指定库路径
-l:指定库名
gcc -o exe code.c -I ./mylib1/include -L ./mylib1/lib -l myc

        以上写法未免也太麻烦,我们能不能让系统自己去找到它们呢?当然可以,只需要我们把头文件放到/usr/include下,把静态库放在/lib64下,就能被系统的默认路径找到,如下:

sudo cp ./mylib1/include/* /usr/include
sudo cp ./mylib1/lib/* /lib64
gcc -o exe code.c -l myc

        我们在生成可执行文件时,-l选项依然不能忘记,因为虽然gcc认识c语言库,但我们自己写的库它并不认识。

五、动态库使用

我们用同样的方法,使用动态库生成可执行文件。

gcc -o exe code.c -I ./mylib2/include -L ./mylib2/lib -l myc

        但我们可以尝试一下,exe其实并不能运行,因为它在运行时又找不到动态库了。

        这是因为静态库在与我们写的程序进行链接生成可执行文件后就与程序绑定到一起了,也就是说它成为了程序的一部分了。而动态库需要在可执行文件开始执行后才开始加载。

我们可以使用以下四种方法让系统找到动态库: 

  1. 拷⻉ .so ⽂件到系统共享库路径下,⼀般指 /usr/lib、/usr/local/lib、/lib64等。
  2. 向系统共享库路径下建⽴同名软连接。
  3. 更改环境变量: LD_LIBRARY_PATH。
  4. ldconfig⽅案:配置/ etc/ld.so.conf.d/ ,ldconfig更新。

http://www.ppmy.cn/embedded/156603.html

相关文章

CSS 溢出问题及解决方案:实用案例与技巧

在网页开发中,CSS 的布局和样式起着至关重要的作用,但经常会遇到一个棘手的问题——溢出问题。溢出是指元素内的内容超出了其设定的容器大小,这不仅会影响页面的美观,还可能干扰用户体验。本文将详细探讨 CSS 溢出问题的案例&…

[STM32 HAL库]串口中断编程思路

一、前言 最近在准备蓝桥杯比赛(嵌入式赛道),研究了以下串口空闲中断DMA接收不定长的数据,感觉这个方法的接收效率很高,十分好用。方法配置都成功了,但是有一个点需要进行考虑,就是一般我们需要…

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(六)-分巧克力、K倍区间

前言 在本博客中,我们将讨论两种常见的算法技巧——二分法和前缀和,并通过实际问题来进行应用。首先,我们会通过二分法解决一个经典的“巧克力分配问题”,该问题需要我们在不同的分配方案中找到最优的解。接着,我们将…

RCWL-93000一款微波雷达传感器模块

RCWL-93000是一款微波雷达传感器模块,它主要用于检测物体的移动。以下是对RCWL-93000的详细介绍: 一、基本特性 工作原理:该传感器基于多普勒效应原理工作,当物体在雷达波的覆盖范围内移动时,会反射雷达波&#xff0…

python 列表属性函数及列表查找元素函数

python 列表属性函数及列表查找元素函数 列表可以一次性存储多个数据,且可以为不同的数据类型 语法: [数据1,数据2,数据3,…] 例如: listdict [{city: 大兴安岭春, min_temp: -30}, {city: 呼伦贝尔, min_temp: -29…

进阶——第十六届蓝桥杯(sscanf的运用)

声明变量 char tx_buf[30];char rx_buf[30];char car_type[5];char car_num[5];char car_time[15]; int sscanf(const char *str, const char *format,...); sscanf函数功能 sscanf 函数从字符串 str 中读取数据,根据 format 所指定的格式将数据存储到后续的变量中…

从语音识别到图像识别:AI如何“看”和“听”

引言 随着人工智能技术的不断进步,AI的“听”和“看”能力正变得越来越强大。从语音识别到图像识别,AI不仅能够通过声音与我们互动,还能通过视觉理解和分析周围的世界。这些技术不仅改变了我们与机器的交互方式,也在各行各业中带…

Excel的配置-开放的XML文件

目的 为什么说Excel的配置呢?就是因为很多程序,都是通过Excel导出数据或者图表之类的东西,那如何导出呢?所以必须了解Excel本身的情况。 虽然现在有第三方的工具,但如何想实现自定义的或者复杂的功能,还是…