随笔- 310  文章- 1  评论- 0  阅读- 86009 

静态库

程序所要用到的库函数代码在链接时全部被copy到程序,如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费。(静态链接库以*.a为后缀)

建立mylib.c

1
2
3
4
int add(int a,int b)
{
return a+b;
}

编译文件并输出目标文件

1
gcc -c mylib.c -o mylib.o

将编译出的mylib.o文件打包成静态连接库

1
ar cqs libmylib.a mylib.o

将libmylib.a文件复制到/usr/lib目录下

1
cp libmylib.a /usr/lib

调用静态库文件 main.c

#include <stdio.h>
int main()
{
printf("1+3=%d\n",add(1,3));
return 0;
}

编译运行

1
2
3
gcc -static -lmylib main.c -o main
 
./main

参数:

"-c":编译选项,只对程序做编译,不链接。
"-static":编译选项,静态编译程序。
"-l":编译选项,指定被编译的程序所依赖的库文件。
ar cqs lib(静态库名).a 被制作的库文件(*.o)。

 

动态库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.建立boye.c
int reduce(int a,int b)
{
return a-b;
}
 
2.编译文件并输出目标文件mylib.o
gcc -c boye.c -o boye.o
 
3.将boye.o 制作成动态链接库,执行命令
gcc -shared -fPIC boye.o -o liboye.so
 
4.将liboye.so动态链接库文件复制到/usr/lib目录下
 
5.编译
gcc  main.c -o main  -lboye

 

总结:
readelf -d 可执行程序:查看可执行程序使用了哪些动态链接库。
gcc -shared -fPIC(库文件名).o -o(动态链接库文件名).so :将库文件制作成动态库。
-fPIC:使输出的对象模块是按照可重定位地址方式生成的。
-shared:指明产生动态链接库。

 posted on   boye169  阅读(93)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示