C语言的本质(34)——静态库
来源:互联网 发布:天刀动漫人物捏脸数据 编辑:程序博客网 时间:2024/05/22 17:33
库是一种软件组件技术,库里面封装了数据和函数。
库的使用可以使程序模块化。
Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。
Linux通常把库文件存放在/usr/lib或/lib目录下。
Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so最为后缀,静态链接库通常以.a作为后缀。
在程序中使用使用静态库和动态库时,他们载入的顺序是不同的。
静态库的代码在编译时就拷贝的应用程序中,这样的优点是节省编译时间。
动态链接库时程序在开始运行后调用库函数时才被载入。
静态库,也称为归档文件(archive),按照惯例它们的名字都以 .a 结尾。比如,标准C语言函数库 /usr/lib/libc.a 和 X11 函数库 /usr/x11/lib/libx11.a .
我们可以容易地创建和维护自已的静态库,只要使用 ar 程序和 gcc -c命令对函数进行分别编译就可以了。
静态库的创建和使用:
1、在一个头文件种声明静态库所导出的函数。
2、在一个源文件种实现静态库所导出的函数。
3、编译源文件,生成可执行代码。
4、将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放库文件的目录下。
下面通过一个例子来说明:mylib.h种存放的是静态库提供给用户使用的函数的声明,mylib.c实现了mylib.h种声明的函数。
/*mylib.h*/#ifndef _MYLIB_H_#define _MYLIB_H_ void weclome(void);void outString(const char *str); #endif
/*mylib.c*/ #include "mylib.h"#include void welcome(void){ printf("welcome to libmylib\n");} void outString(const char *str){ if(str != NULL) printf("%s\n", str);}
1、编译mylib.c:产生要包含在库文件中的目标。这通过调用带有 -c 选项的 C 语言编译器来实现。-c 选项的作用是阻止编译器创建一个完整的程序。
gcc -o mylib.o -c mylib.c
2、将目标文件加入到静态库中:创建并使用一个库文件。 我们用 ar 程序创建一个归档文件并将目标文件添加进去。这个程序之所以称为 ar,是因为它将若干个单独的文档归并到一个大的文件中以创建归档文档或集合。注意,我们也可以用 ar 程序来创建任何类型文件的归档文件 (请注意,ar 只是一个通用工具.)
ar rcs libmylib.a mylib.o
3、将静态库copy到Linux的库目录(/usr/lib或者/lib)下:
cp libmylib.a /usr/lib/libmylib.a
编写调用库函数的测试程序test.c:
#include "mylib.h"#include int main(void){ printf("create and use library:\n"); welcome(); outString("it's successful\n"); return 0;}
4、使用静态库编译:
gcc -o testtest.c -l mylib
这里注意,编译时无需带上前缀和后缀。
5、运行可执行程序
test: ./testcreate and use library:welcome to libmylibit's successful
在Linxu下,可以使用ar命令来创建和修改静态库。
这些在linux下man ar一下就可以得到参数,这里说明几个常用的
d:从库中删除成员文件。
r:在库中加入成员文件,若存在,则替换。
c:创建一个库。
s:无论ar命令是否修改了库内容,都强制重新生成库符号表。
其他的命令可是使用man查看。
- C语言的本质(34)——静态库
- C语言的本质(10)——指针本质
- C语言的本质(35)——共享库
- C语言的本质(3)——整数的本质与运算
- C语言的本质(4)——浮点数的本质与运算
- C语言的本质(5)——类型转换的本质与处理
- C语言的本质(6)——位运算
- C语言的本质(36)——makefile基础
- C语言的本质(31)——C语言与汇编之函数调用的本质
- C语言的本质(22)——C标准库之字符串操作
- C语言的本质(23)——C标准库之输入与输出(上)
- C语言的本质(24)——C标准库之输入与输出(下)
- C语言的本质(25)——C标准库之内存管理
- C语言的本质(26)——C标准库之数值字符串转换
- C语言的本质(15)——C语言的函数接口入门
- C语言的本质(7)——C语言运算符大全
- C语言的本质(27)——C语言与汇编之计算机结构
- C语言的本质(30)——C语言与汇编之ELF文件格式
- java 反射例子汇总
- Effective C# Item12:变量初始化器优于赋值语句
- 关于Mac Pro蓝牙接收移动设备传送文件的问题
- Xcode项目参数配置——Apple LLVM5.0 -Language - ObjectC
- C#调用C++生成的dll获取CPU序列号(一)
- C语言的本质(34)——静态库
- Android获取手机的型号和系统版本
- 设置系统时间
- 关于Apache的日志
- hdu4864 贪心
- 概率p输出1,概率1-p输出0,等概率输出0和1
- 背包问题
- Effective C# Item13:使用静态构造器初始化静态类成员
- Android Launcher研究(四)-----------桌面应用快捷方式的开发!