静态库与动态库的创建和使用
库library
有时看着源代码裸奔,总觉得有点点羞羞。有没有办法给她套件衣服呢?
那件衣服就是 -> 高大上的(nei)库,想到哪去来。。。
------------华丽分割线---------
库:一个可供使用的各种标准程序、子程序、文件以及它们的目录等信息的有序集合!(百度百科)
看着晕,其实库就是那种 .lib .dll这些结尾的,它里面封装着许多函数的定义,只是他们已经变成对象文件 如:.o、.obj 。等着链接(link).链接就是把多个.o文件链成一个可执行文件。啊 ,跑偏了。
总之:库就是许多函数实现的对象文件的集合。
库分为两种:静态库,动态库
静态库:在编译链接时就把库的代码提取出来加入可执行文件中,程序执行不在依赖库。
动态库:在编译链接时只记录了要用的名字(函数变量)在哪个库,运行时才从库找。
对比:静态库生成的可执行文件大,库升级后,必须重新产生可执行文件。
动态库运行时慢,但库可以更新,原可执行文件不用在生成,代码可以重用。window系统很多地方用到动态库(就像.dll文件)
好了,接下来我们就自己制作自己的库把
静态库:
1)产生库
1.1.写程序(一般没main)
#include <stdio.h>
extern int a;
void welcome(const char*name)
{
printf("welcome %s\n",name);
}
1.2. gcc -c xxx1.c(产生xxx1.o文件)//xxx自己取名字
gcc -c xxx2.c
1.3. 再写个头文件xxx.h,里面放这些函数和全局变量的声明(extern int a)
#ifndef JING_LIB
#define JING_LIB
extern int a;
void welcome(const char*name);
#endif
1.4.ar -r libxxx.a xxx1.o xxx2.o
搞定
2)使用库
写个程序usexxx.c,包含头文件xxx.h,程序可以调用库中的函数或访问库中的全局变量,然后编译usexxx.c。最后链接usexxx.o和libxxx.a
gcc -c usexxx.c(-c表示只编译)
gcc usexxx.o libxxx.a(链接生成可执行文件)
2.动态库(共享库)libxxxx.so
1).产生库
1.1 写程序(一般没main)
gcc -shared -o libxxx.so xxx1.c xxx2.c
2).使用库
2.1编译时:
2.1.1编写usexxx.c
gcc -c usexxx.c
gcc usexx.o -lxxx -L
2.2 运行时:
2.2.1设置环境变量LD_LIBRARY_PATH的值为动态库所在的目录
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
2.2.2运行可执行文件
3).更新库
3.1 更新usexxx.c
gcc -shared xxx1.c xxx2.c -o libxxx.so
3.2 直接执行可执行文件