peggyee  

 

在现实的编程生活中,源代码是程序员的智慧的结晶,程序员在项目开发的过程中,为了保证自已拥有的版权,常常需要某些手段把源代码保护起来,而将代码打包成库文件便是其中的手段之一。

库文件主要有两种:静态库和动态库。静态库和动态库的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。

以下便是我的学习过程:

(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目录,将制定目录下的动态链接库被系统共享起来即可。

 

静态库和动态库的建立实际上有许多相同之处,在建立库的原理和步骤上大致一致,只是执行命令有些出入。两者之间都有各自的优缺点,静态库建立了之后很少会出现文件不能执行的问题,但是生成的执行文件却内存过大;动态库相反。使用哪种方法,看个人所好。

posted on 2020-03-21 22:52  peggyee  阅读(205)  评论(0)    收藏  举报