gcc生成静态库和动态库

目录

一、用gcc生成静态库和动态库

1、要求

2、静态库和动态库的定义

3、实例

(1) 实例一

(2)实例二

二、总结


一、用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生成静态库和动态库的练习过程,基本上能够熟练的生成静态库和动态库。在两种库的比较中,能够明显静态库要比动态库要小很多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值