在现实的编程生活中,源代码是程序员的智慧的结晶,程序员在项目开发的过程中,为了保证自已拥有的版权,常常需要某些手段把源代码保护起来,而将代码打包成库文件便是其中的手段之一。
库文件主要有两种:静态库和动态库。静态库和动态库的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。
以下便是我的学习过程:
(1)没有库的实现
add.c
int add(int a,int b) { return a + b ; }
sub.c
int sub(int a,int b) { return a - b ; }
swap.c
void swap(int **p1,int **p2) { int *p; p = *p1; *p1 = *p2; *p2 = p; }
测试文件test.c
#include<stdio.h> #include<stdlib.h> #include "cal.h" int main(int argc,char **argv) { int a,b;int *pt1,*pt2; printf("please input a,b:\n"); scanf("%d,%d",&a,&b);
printf("%d add %d is %d\n",a,b,add(a,b)); printf("%d sub %d is %d\n",a,b,sub(a,b)); pt1=&a;pt2=&b; if(a<b) s( a,b); else printf("%d > %d\n",a,b); return 0;
建立一个头文件cal.h
#ifndef cal_h #define cal_h int add(int,int); int sub(int,int); int s(int,int); #endif
然后建立Makefile文件
OBJ=test.o add.o sub.o swap.o test:$(OBJ) cal.h gcc $(OBJ) -o test test.o:test.c add.o:add.c sub.o:sub.c swap.o:swap.c

如图所示,cal .h为头文件,*.c均为源文件,当存在Makefile文件时,使用命令 “make”即可将头文件与源文件连接起来,生成*.o中间文件以及可执行文件text。
(2)静态库的建立
步骤如下:
1.mkdir libSamp 建立一个libSamp目录。
2.ar rcs libLYT.a add.o sub.o swap.o “libLYT.a”中的lib为库文件的固定前缀,.a为后缀,LYt为自行命名的文件名称;*.o则是除了我们的测试文件对应的.o文件外的所有中间目标文件。
3."cp test.c cal.h libLYT.a libSamp" 复制测试文件和头文件以及静态库
4."gcc -o test test.c -stastic -L. -lLYT" gcc指编译器,-o表示指定的目标文件,test指可执行文件,-stastic表示使用静态库,lLYT表示库文件的名称。
5.执行命令“./test”执行可执行文件

查看文件大小

可以看出:使用静态库文件的可执行文件的大小为958488字节,而未进行库文件处理的可执行文件为8616字节。由此可见静态库的缺点,便是内存过大。
此时在静态库文件的可执行文件中,代码就被打包成“乱码”了。

(3)动态库的建立
步骤如下:
1.建立一个libLYT.so 目录
2.将*.o文件,test.c和头文件复制到libLYT.so目录表下
3.gcc -shared -fPIC -o libLYT.so add.o sub.o swap.o生成动态库
4.gcc -o test test.c -L. -lLYT生成可执行文件
5.查看文件大小,对比之下可见,动态库生成的文件比静态库小的多

接下来执行可执行文件的时候,可能会出现错误。这个时候,使用命令ldconfig目录,将制定目录下的动态链接库被系统共享起来即可。
静态库和动态库的建立实际上有许多相同之处,在建立库的原理和步骤上大致一致,只是执行命令有些出入。两者之间都有各自的优缺点,静态库建立了之后很少会出现文件不能执行的问题,但是生成的执行文件却内存过大;动态库相反。使用哪种方法,看个人所好。

浙公网安备 33010602011771号