linux静态链接库
2024-09-27 03:35:08
库
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)
静态库
之所以称为“静态库”,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。
特点
- 可以实现共享代码
- 不能再包含其他静态链接库
- 本身包含了代码,地址符号表等,静态链接库的使用中,连接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中
- 代码装载速度快,执行速度略比动态链接库快
- 只需保证在开发者的计算机中有正确的 .a 文件,在以二进制形式发布程序时不需考虑在用户的计算机上 .a 文件是否存在及版本问题
- 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
创建
- 编写源文件,通过 gcc -c xxx.c 生成目标文件
- 使用 ar 命令归档目标文件,生成静态库
- 配合静态库,写一个使用静态库中的函数的头文件
- 链接静态库,生成可执行文件
例子
源文件
add.c 文件:
int add(int a, int b)
{
return a + b;
}
subtract.c 文件:
int subtract(int a, int b)
{
return a - b;
}
编译两个文件,生成目标文件 add.o subtract.o
gcc -c add.c subtract.c
归档目标文件,生成静态链接库 libmath.a
使用 ar 命令将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索
ar rcv libmath.a add.o subtract.o
有关 ar 命令的使用,makepage 有详细的说明,常用的选项是:
c -- 如果库文件不存在,生成新的库文件,并不打印警告
r -- 代替库中已有的文件或者插入新的文件
v -- 输出详细信息
d -- 删除库中的某个目标文件
t -- 列出归档文件中包含的目标文件
我们生成的库文件名字必须形如 libxxx.a,这样我们在链接库的时候,就可以使用 -lxxx。
当我们链接时,指定 -lxxx,链接器就会在指定的目录查找 libxxx.a 或 libxxx.so 文件
编写头文件 mymath.h
#ifndef _MYMATH_H_
#define _MYMATH_H_ int add(int, int);
int subtract(int, int); #endif
使用静态库
编写文件 main.c
#include <stdio.h>
#include "mymath.h" int main()
{
printf("%d, %d\n", add(, ), subtract(, )); return ;
}
编译链接
gcc main.c -L. -lmath
这里,-L 指定搜索链接库的包含当前目录
使用Makefile
.PHONY: all
all: build target build: libmath.a libmath.a: add.o subtract.o
ar rc $@ add.o subtract.o add.o: add.c
gcc -c $<
subtract.o: subtract.c
gcc -c $< target: a.out
a.out: main.c
gcc main.c -L. -lmath .PHONY: clean
clean:
rm *.o libmath.a a.out
最新文章
- Android 笔记 文件存取 day5
- HDU 5923 Prediction
- .NET 配置文件简单使用
- html 中添加背景音乐
- printf()函数
- 关于FireFox类VIM插件。VimPerator
- 【高可用HA】Apache (1) —— Mac下安装Apache Httpd到自定义路径(非/etc/apache2)
- POJ 3335 Rotating Scoreboard(半平面交求多边形核)
- VS2008 未找到编译器可执行文件 csc.exe【当网上其他方法试玩了之后不起作用的时候再用这个方法】
- pl/sql 关于变量定义的问题
- 七日筑基——C#第二天
- php 函数积累第一天
- 使用es6特性封装async-mysql
- leetcode刷题指南
- 我手写的简易tomcat
- Android Studio工程项目打包成SDK(jar或aar格式)
- es6(一)
- Go语言规格说明书 之 select语句(Select statements)
- QT 5.12 安装MinGW 7.3.0 32bit
- Arduino和C51开发光敏传感器