目录
一、用gcc生成静态库和动态库
1、要求
编写x2x函数和x2y函数(功能自定),main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件
(1)将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
(2)将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
2、静态库和动态库的定义
我们通常把一些 公用函数制作成函数库供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并
不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
3、实例
命令说明
#mkdir test /创建新的目录
#cd test /打开目录编辑
#touch hello.h /建立新的文件在该目录下
#vim hello.h /打开编辑文件
#ls /查询该文件目录下的所有文件
(1)实例一
①创建一个文件夹test1,在这个文件夹里创建三个文件main.c,hello.c,hello.h
在每个文件里输入以下代码,可以用vim编辑也可以打开文件夹直接编辑。
main.c
#include“hello.h”
int main()
{
hello("everyone!");
return 0;
}
hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("hello %s\n",name);
}
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
②gcc编译得到.o文件
gcc -c hello.c
输入ls查看.o文件是否创建成功,出现hello.o,说明文件创建成功
③创建静态库:
ar -crv libmyhello.a hello.o
静态库文件命名规范:前缀为lib,加上静态库名,扩展名为.a。
输入ls查看静态库文件是否创建成功,出现libmyhello.a,说明静态库创建成功
④在静态库中使用其中的内部的函数:需在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后再用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将这些公用函数连接到目标文件中。
先生成main.o 文件
gcc -c main.c
再生成可执行文件gcc -o hello main.o libmyhello.a
⑤.验证静态库的使用特点
在删除静态库的情况下,运行可执行文件,发现程序仍然可以正常运行,表明静态库跟执行程序没有关系。同时,说明了静态库是在程序编译的时候连接上目标代码的。
⑥创建动态库
动态库文件命名规范:前缀为lib,加上动态库名,扩展名为.so。
gcc -shared -fPIC -o libmyhello.so hello.o
shared:表示指定生成动态链接库,不可省略
-fPIC:表示编译为位置独立的代码,不可省略命令中的-o一定不能够被省略
⑦.使用动态库
出现错误。虽然连接时连接的时用的是当前目录,但是由于运行可执行文件时,是在usr/lib
中找库文件的,故将libmyhello.so
复制到目录usr/lib
中即可
⑧.静态库与动态库比较
gcc编译得到.o文件 gcc -c hello.c
创建静态库 ar -crv libmyhello.a hello.o
创建动态库 gcc -shared -fPIC -o libmyhello.so hello.o
使用库生成可执行文件 gcc -o hello main.c -L. -lmyhello
执行可执行文件 ./hello
注意:当静态库和动态库同时存在的时候,程序会优先使用动态库。
(2)实例二
①创建一个文件夹test2,在文件夹里面创建main.c,sub1.c,sub2.c,sub.h四个文件
在各个文件输入以下代码,可以用vim编辑,也可以打开文件直接编辑
main.c
#include<stdio.h>
#include"sub.h"
void main()
{
int a,b;
printf("Please input the value of a:");
scanf("%d",&a);
printf("Please input the value of b:");
scanf("%d",&b);
printf("a+b=%.2f\n",x2x(a,b));
printf("a/b=%.2f\n",x2y(a,b));
}
sub1.c
float x2x(int a,int b)
{
float c=0;
c=a+b;
return 0;
}
sub2.c
float x2y(int a,int b)
{
float c=0;
c=a/b;
return c;
}
sub.h
#ifndef SUB_H
#define SUB_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif
②创建静态库文件
gcc -o mian main.c libsub.a:
生成可执行文件
ar crv libsub.a sub1.o sub2.o:创建静态库文件libsub.a
③创建动态库文件
gcc shared -fPIC -o libsub.so sub1.o sub2.o:创建动态库文件
gcc -o main main.c libsub.so
④动态库文件和静态库文件的比较
经过比较发现静态库要比动态库要小很多,生成的可执行文件大小两者之间也存在较小的差别。
二、总结
通过两个程序用gcc生成静态库和动态库的练习过程,基本上能够熟练的生成静态库和动态库。在两种库的比较中,能够明显静态库要比动态库要小很多。