建立静态库和动态库的学习

Posted peggyee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建立静态库和动态库的学习相关的知识,希望对你有一定的参考价值。

 

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

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

以下便是我的学习过程:

(1)没有库的实现

技术图片

如图所示,cal .h为头文件,*.c均为源文件,当存在Makefile文件时,使用命令 “make”即可将头文件与源文件连接起来,生成*.o中间文件以及可执行文件。

 

(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.查看文件大小,对比之下可见,动态库生成的文件比静态库小的多

 技术图片

 

(4)附测试文件test.c

#include<stdio.h>
#include<stdlib.h>

#include "cal.h"

int main(int argc,char **argv)
{
        int a,b;
        printf("please input a,b:
");
        scanf("%d,%d",&a,&b);

        printf("%d add %d is %d
",a,b,add(a,b));
        printf("%d sub %d is %d
",a,b,sub(a,b));
        if(a<b)
        s( a,b);
        else
                printf("%d > %d
",a,b);
        return 0;
}

 

以上是关于建立静态库和动态库的学习的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(二五零)动态库和静态库的选择顺序

动态库和静态库的区别

关于动态库和静态库的问题。

C语言学习笔记--动态库和静态库的使用

关于Linux静态库和动态库的分析

详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别