gcc生成动态库.so和静态库.a文件的原理及使用示例。

gcc生成静态库.a和动态库.so

一、gcc生成静态库

1.hello实例使用库

准备过程:
1.创建一个目录
2.hello代码
hello.h

#ifndef HELLO1_H
#define HELLO1_H
void hello(const char *name);
#endif//HELLO_H
hello.c
#include<stdio.h>
void hello(const char *name)
{
	printf("Hello %s\n",name);
}

main.c

#include"hello1.h"
int main()
{
	hello("everyone");
	return 0;
}

在这里插入图片描述
gcc编译得到.o文件
gcc -c hello1.c

在这里插入图片描述
2.静态库使用

  • 创建静态库
    a.创建静态库的工具:ar
    b.静态库文件命名规范:以lib作为前缀,是.a文件
    c.代码如下ar -crv libmyhello.a hello1.o
    在这里插入图片描述
  • 程序中使用静态库,有两种方法。

①gcc -o hello1 main1.c -L. -lmyhello
在这里插入图片描述
②gcc main1.c libmyhello.a -o hello1
在这里插入图片描述

  • 验证静态库的特点
    首先,使用命令rm libmyhello.a删除静态库,然后运行程序。
./hello1

在删掉静态库的情况下,运行可执行文件,发现程序仍旧正常运行,表明静态库跟程序执行没有联系。同时,也表明静态库是在程序编译的时候被连接到代码中的。
在这里插入图片描述

二、生成动态库

  • 创建动态库
    创建动态库的工具:gcc
    动态库文件命名规范:以lib作为前缀,是.so文件
gcc -shared -fPIC -o libmyhello.so hello1.o

在这里插入图片描述

  • 在程序中执行动态库
gcc -o hello main.c -L. -lmyhello
gcc main.c libmyhello.so -o hello

将libmyhello.so复制到目录/usr/lib中。由于运行时,是在/usr/lib中找库文件的。
注:需获取超级管理员权限。

mv libmyhello.so /usr/lib

在这里插入图片描述
最后,可以运行hello1。
在这里插入图片描述

使用示例:

sub1.c

float x2x(int a,int b)
{
	float c=0;
	c=a+b;
	return c;
}

sub2.c

float x2y(int a,int b)
{
	float c=0;
	c=a/b;
	return c;
}

sub1.h

#ifndef SUB1_H
#define SUB1_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif

main.c

#include"sub1.h"
int main()
{
int a,b;
a=2;
b=3;
float c1,c2;
c1=x2x(a,b);
c2=x2y(a,b);
printf("%.2f\n",c1);
printf("%.2f\n",c2);
return 0;

}

输入命令编译:gcc -c sub1.c sub2.c
编译后生成目标.o文件。
在这里插入图片描述

静态库示例使用

输入如下命令

ar crv libsub.a sub1.o sub2.o

在这里插入图片描述
生成.o文件

gcc -o main main.c libsub.a

输入./main程序运行成功。
在这里插入图片描述

动态库示例使用

  • 与动态库使用类似。
    输入如下命令
gcc -shared -fPIC -o libsub.so sub1.o sub2.o

在这里插入图片描述
生成.o文件

gcc -o main main.c libsub.so

在这里插入图片描述

同样,需要移动生成的.so文件,然后输入./main程序运行成功。
在这里插入图片描述
通过比较发现静态库要比动态库要小很多,生成的可执行文件大小也存在较小的差别。

总结

通过这次实验,我们可以了解到静态库与动态库的区别以及使用方法。
参考文献:
gcc生成静态库.a和动态库.so以及opencv的安装及使用示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值