建立静态库和动态库的学习
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; }
以上是关于建立静态库和动态库的学习的主要内容,如果未能解决你的问题,请参考以下文章