简述:本文讲了什么是库和怎么用库。。。
这里的步骤,只要你挨个执行,肯定会成功,这篇文章肯定能帮你建立库,调用库!!!
一、为什么要使用库文件
库文件相当于一个公共仓库,里面放一些会重复使用的公共代码,如某些函数、常量等。这样,不同的当文件想用某段代码时,不用再费劲写,直接调用库文件就行了!而且,修改起来也方便,对吧!
二、静态库与动态库
静态库,程序在编译时加载库文件的代码。
动态库,程序在运行时加载库文件的代码。
换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀。
如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大。
静态库的原则是“以空间换时间”,增加程序体积,减少运行时间;动态库则是“以时间换空间”,增加了运行时间,但减少了程序本身的体积。
三、静态库的编写和使用
静态库文件的扩展名一般为.a
编写步骤:
1、编写函数文件,test.c
#include <stdio.h>
void test(char* arg){
printf("test: we passed %s\n", arg); //输出字符串
}
2、编译函数文件,生成test.o,用ls *.o查看生成的所有.o文件
$ gcc -c test.c
-c的作用是,阻止编译器创建一个完整的程序。你看,如果,不用-c,那就是在创建一个完整程序,那就会失败,因为,你还没定义main函数!
3、编写头文件 test.h:
void test(char* arg); //就是简单的声明
4、编写调用程序,并编译,program.c,来调用库文件
#include <stdlib.h>
#include "test.h"
int main(){
test("hello world");
exit(0);
}
编译,注意:这里也得用-c,为了生成program.o来和test.o链接
$ gcc -c program.c //生成program.o !!!
5、与目标文件链接,并运行测试:为编译器显示的指定目标文件
$ gcc -o program program.o test.o //指定名称,直接调用目标文件test.o。注意,这里的test.o是test.c生成的,目前没对test.h做任何操作!,,,我这名字起的不好,以后更改。
$ ./program //运行program.o
test : we passed hello world
$
6、创建库文件,并添加目标文件(函数)
使用ar程序创建一个归档文件(静态库),并将你的目标文件添加进去。libtest.a就是指test库文件,libxx.a指示一种格式!
$ ar crv libtest.a test.o //把test.h生成静态库文件libtest.a ,并添加目标文件test.o
a - test.o //表示目标文件成功添加到库文件
7、调用库文件
$ gcc -o program program.o libtest.a //program.o调用库文件libtest.a,为了使用库里面的目标test.o
$ ./program
test: we passed hello world
$
你也可以使用-l来访问库函数,但因其未保存在标准位置,所以,你必须使用-L来告诉编译器,怎找到它:
$ gcc -o program program.o -L. -ltest
$ ./program
test: we passed hello world
$
-L. 告诉编译器,在当前目录(.)查找函数库。ltest告诉编译器,使用名为 libtest.a的函数库。
四、动态库的编写(共享库)
动态库一般以.so结尾,就是shared object的意思。
步骤:
1、编写函数文件
2、编译生成动态库文件,要加上 -shared 和 -fpic 选项 ,
库文件名以lib开头, 以.so 结尾。
使用方式分为两种: 隐式调用和显示调用