Linux系统编程之gcc编译器静态库的制作和使用

根据链接时期的不同,库有静态库和动态库之分。静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。本文给大家示例说明一下gcc编译器如何编译和使用静态库。

一、静态库文件命名规范
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为demo,则静态库文件名就是libdemo.a。执行:ar rcs libdemo.a demo.o,生成libdemo.a文件。

二、静态库的制作步骤
1、利用“gcc -c”将*.c源文件生成*.o文件
源文件结构如下:

[ycxie@fedora Demo]$ tree
.
├── include
│   └── common.h
└── src
    ├── add.c
    ├── div.c
    ├── mul.c
    └── sub.c
[ycxie@fedora src]$ gcc -c *.c -I ../include
[ycxie@fedora src]$ ll
total 32
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 add.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 add.o
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 div.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 div.o
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 mul.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 mul.o
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 sub.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 sub.o

2、使用ar命令将.o文件打包成静态库

[ycxie@fedora src]$ ar rcs libdemo.a *.o
[ycxie@fedora src]$ ll
total 40
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 add.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 add.o
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 div.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 div.o
-rw-rw-r--. 1 ycxie ycxie 5304 May 28 10:42 libdemo.a
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 mul.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 mul.o
-rw-rw-r--. 1 ycxie ycxie   62 May 28 10:31 sub.c
-rw-rw-r--. 1 ycxie ycxie 1240 May 28 10:35 sub.o

三、静态库的使用方法

[ycxie@fedora Demo]$ mkdir lib
[ycxie@fedora Demo]$ mv src/libdemo.a lib
[ycxie@fedora Demo]$ cat main.c
#include <stdio.h>
#include <common.h>

int main(void)
{
	int i = 200, j = 10;
	int a, s, m, d;

	a = add(i, j);
	s = sub(i, j);
	m = mul(i, j);
	d = div(i, j);

	printf("%d + %d = %d\n", i, j, a);
	printf("%d - %d = %d\n", i, j, s);
	printf("%d * %d = %d\n", i, j, m);
	printf("%d / %d = %d\n", i, j, d);

	return 0;
}
[ycxie@fedora Demo]$ gcc main.c -o main -Iinclude -Llib -ldemo
[ycxie@fedora Demo]$ ./main
200 + 10 = 210
200 - 10 = 190
200 * 10 = 2000
200 / 10 = 20

Leave a Reply

Your email address will not be published. Required fields are marked *