[相关信息]
在编译含多线程的程序时需要加 -lpthread 进行编译。正好也学习一下,Linux静态库的制作及使用。
什么是库
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)
静态库与动态库区别
所谓静态与动态是指链接。静态库与动态库区别来自【链接阶段】如何处理库,链接成可执行程序。分别称为静态链接方式、动态链接方式。
之所以称为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。这样程序在运行时与函数库再无瓜葛,移植方便。但会浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
linux静态库的命名规则
Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a
[静态库的制作过程]
第一步:编写静态库代码
1)定义头文件 reader.h
#ifndef READER_H_ #define READER_H_ int open(char *name); int close(char *name); #endif // READER_H_
2)编写函数体 reader.c
#include <stdio.h> int open(char *name) { printf("%s opened. ", name); return 0; } int close(char *name) { printf("%s closed. ", name); return 0; }
第二步:将代码文件编译成目标文件.o
$ gcc -c reader.c
第三步:生成静态库文件
$ ar -crv libreader.a reader.o
此时在当前目录下会生成 libreader.a
[静态库的调用]
使用静态库,只需要在编译的时候,指定静态库的搜索路径(-L选项)以及指定静态库名(不需要lib前缀和.a后缀,由-l引导)
第一步:编写测试代码 testlib.c
#include "reader.h" int main() { char readerName[20] = "81Reader"; open(readerName); close(readerName); return 0; }
第二步:调用静态库
$ gcc testlib.c -L ./ -lreader -o testlib
第三步:测试结果
$ ./testlib
81Reader opened.
81Reader closed.