Linux下静态库和动态库(共享库)的制作和使用

简介: Linux下静态库和动态库(共享库)的制作和使用

Linux操作系统支持的库函数分为:

    静态库:libxxx.a,在编译时就将库编译进可执行程序中

优点:程序的运行环境中不需要外部的函数库

缺点:可执行程序大

    动态库:又称共享库,libxxx.so,在运行时将库加载到可执行程序中

优点:可执行程序小

缺点:程序的运行环境中必须提供相应的库

库函数目录: /lib /usr/lib

一、静态库的制作

1. 生成目标文件: gcc -c file.c

2. 静态函数库创建命令:ar

   ar -cr libfile.a file.o

   -c create的意思

   -r replace的意思,表示当插入的模块file.o已经存在于libfile.a中,则覆盖,反之ar显示一个错误消息

静态库操作的几个实例

情况1:如果从别处得到一个静态库libunkonwn.a,想知道其中包含哪些模块

命令:ar- t libunknown.a

   静态库的编译:gcc -o main main.c -L. -lfile编译main.c就会把静态库函数整合进main

其中:

   -L指定静态库函数的位置供查找,注意L后面还有’.’,表示静态函数库在本目录下查找

   -l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略

 

下面操作一波实际过程中静态库是如何制作的

1. main.c
2. ---------------------------------------------------------------------------
3. #include <stdio.h>
4. 
5. itn main(void)
6. {
7.     int ret;
8.     int x = 10, y = 5;
9.     ret = sub(x, y);
10.     printf(“ret = %d\n”, ret);
11. 
12.     return 0;
13. } 
14. 
15. sub.c
16. --------------------------------------------------------------------------
17. int sub(int x, int y)
18. {
19.     return (x – y);
20. }

 

编译过程如下:

1. gcc -c -o sub.o sub.c        //生成sub.o文件
2. ar -cr -o libsub.a sub.o        //用上一步生成的sub.o文件生成libsub.a文件
3. gcc main.c -L. -lsub        //将libsub.a静态库编译进main.c中

此时删除libsub.a之后,程序依然可以运行,是因为libsub.a已经编译进main程序中了

二、动态函数库的制作

1. 生成目标文件: gcc -c file.c

2. gcc -shared -fpic -o libfile.so file.o

   -fpic:产生位置无关码

   -shared:生成共享库

   用上述命令生成libaddsub.so动态库函数

   gcc -o out main.c -L. -lfile

   此时还不能立即./a.out,因为在动态库函数使用时,会查找/usr/lib /lib目录下的动态库函数,而此时我们生成的库不在那个目录下,那么如何执行呢?

第一种方法:

   将libaddrsub.so拷贝到/usr/lib或/lib中

第二种方法:假设libfile.so在/home/linux/file路径下

   export LD_LIBRARY_PATH=/home/linux/file/addsub:$LD_LIBRARY_PATH

第三种方法:

   在/etc/ld.so.conf文件里面加入我们生成的目录,然后/sbin/liconfig

   /etc/ld.so.conf是非常重要的一个目录,里面存放的是连接器和加载器搜索共享库时的重要目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig

 

下面操作一波实际过程中静态库是如何制作的

1. main.c
2. ---------------------------------------------------------------------------
3. #include <stdio.h>
4. 
5. itn main(void)
6. {
7.     int ret;
8.     int x = 10, y = 5;
9.     ret = sub(x, y);
10.     printf(“ret = %d\n”, ret);
11. 
12.     return 0;
13. } 
14. 
15. sub.c
16. --------------------------------------------------------------------------
17. int sub(int x, int y)
18. {
19.     return (x – y);
20. }

编译过程如下:

1. gcc -c -o sub.o sub.c                    //生成sub.o文件
2. gcc -shared -fpic -o libsub.so sub.o        //用上一步生成的sub.o文件生成libsub.so文件
3. gcc main.c -L. -lsub

 

在用上面的方法将libsub.so导入到环境变量中,此时执行生成的可执行就可以看到执行结果了。

相关文章
|
15天前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
206 19
|
4月前
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
4月前
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
|
4月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
38 0
|
5月前
|
Linux 编译器 vr&ar
【Linux】静态库和动态库
本文详细介绍了Linux系统中静态库和动态库的概念、区别、制作与使用方法,包括它们在链接时的区别、加载机制以及优缺点。
82 0
|
7月前
|
Linux vr&ar C语言
|
Linux 编译器 vr&ar
|
7月前
|
存储 Linux 编译器
Linux静态库与动态库的使用
Linux静态库与动态库的使用