linux静态库与动态库

库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在Linux 下有静态库和动态库。

静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。因此编译出来的体积就比较大。以 lib 开头,以.a 结尾。使用 ar 命令创建静态库。

动态库(动态库也叫共享库)在程序编译的时候不会被链接到目标代码里面,而是在程序运行的时候被载入的。所以程序在运行的时候需要动态库了。因此编译出来的体积就比较小。以lib 开头,以.so结尾。使用 gcc 命令创建动态库。

一、制作静态库

1.1、新建 mylib.c 文件

c 复制代码
#include<stdio.h>
void mylib(void);
void mylib(void)
{
	printf("This is mylib\n");
}

1.2、将源码.c 文件编译生成.o 文件

使用以下指令将源码.c 文件编译生成.o 文件

c 复制代码
sudo gcc -c mylib.c

1.3、使用 ar 命令创建静态库

使用以下指令创建静态库

c 复制代码
ar cr libmylib.a mylib.o

1.4、编写测试代码 test.c

编写测试代码 test.c如下

c 复制代码
#include <stdio.h>
void mylib(void);
int main(void)
{
	mylib();
	return 0;
}

1.5、编译测试文件 test.c

使用如下指令编译测试文件 test.c

c 复制代码
gcc test.c -lmylib -L .

1.6、运行测试 a.out

运行测试 a.out,如下图所示:

二、制作动态库

2.1、新建 mylib.c 文件

新建 mylib.c 文件,编辑内容如下所示

c 复制代码
#include<stdio.h>
void mylib(void);
void mylib(void)
{
	printf("This is mylib\n");
}

2.2、将源码.c 文件编译生成.o 文件

使用以下指令将源码.c 文件编译生成.o 文件

c 复制代码
gcc -c -fpic mylib.c 

2.3、使用 gcc 命令创建动态库

使用以下指令创建动态库

c 复制代码
gcc -shared -o libmylib.so mylib.o

2.4、编写测试代码 test.c

编写测试代码 test.c,编辑内容如下所示:

c 复制代码
#include <stdio.h>
void mylib(void);
int main(void)
{
	mylib();
	return 0;
}

2.5、编译测试文件 test.c

使用如下指令编译测试文件 test.c

c 复制代码
gcc test.c -lmylib -L .

或者使用绝对目录

c 复制代码
gcc test.c -lmylib -L /home/z/myshare/lib/2

2.6、运行测试 a.out

运行测试 a.out,如下图所示:

三、动态库使用

在动态库使用是,系统会默认去/lib,/usr/lib 目录下去查找动态函数库,如果我们使用的库不在里面,就会提示错误。解决这个问题有两种方法。

第一种方法:将生成的动态库拷贝到/lib 或者/usr/lib 里面去,因为系统会默认去这俩个路径下寻找。

第二种方法:把我们的动态库所在的路径加到环境变量里面去,比如我们动态库所在的路径为/home/test,我们就可以这样添加,但是这种方法只在当前设置的窗口有效。

c 复制代码
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/z/myshare/lib/2
相关推荐
jjkkzzzz40 分钟前
Linux下的C/C++开发之操作Zookeeper
linux·zookeeper·c/c++
二当家的素材网41 分钟前
Centos和麒麟系统如何每天晚上2点10分定时备份达梦数据库
linux·数据库·centos
挑战者66688842 分钟前
CentOS 系统高效部署 Dify 全攻略
linux·运维·centos
DD_陈东东1 小时前
gdbus 常用数据结构与库函数
linux
DIY机器人工房2 小时前
代码详细注释:ARM-Linux字符设备驱动开发案例:LCD汉字输出改进建议开发板断电重启还能显示汉字,显示汉字位置自定义
linux·嵌入式·文件io·diy机器人工房
得物技术2 小时前
eBPF 助力 NAS 分钟级别 Pod 实例溯源|得物技术
linux
Rudon滨海渔村2 小时前
解决阿里云ubuntu内存溢出导致vps死机无法访问 - 永久性增加ubuntu的swap空间 - 阿里云Linux实例内存溢出(OOM)问题修复方案
linux·运维·ubuntu
A-刘晨阳3 小时前
【Linux】Redis 6.2.6 的二进制部署【适用于多版本】
linux·运维·redis
cat_with_cat3 小时前
Linux网络:UDP socket创建流程与简单通信
linux·网络·udp
2401_861615284 小时前
跨平台的ARM 和 x86 Docker 镜像:汇编语言实验环境搭建
linux·汇编·ubuntu·docker·容器