Linux的静态库与动态库的建立


我们在使用每一种编程语言时都会遇到函数库的概念,只需要添加某个头文件,就可以调用其中提供的各种函数接口,简单便捷的实现多种功能。本文将向大家介绍在linux系统中,如何建立C语言的静态函数库和动态函数库。

一、gcc建立.a静态库

静态库在程序编译时会被链接到目标代码中,在程序运行时便不再需要相应静态库文件。


1、创建相关源文件
主程序main.c求和sub1.c乘积sub2.c主函数头文件sub.h

main.c

#include"stdio.h"
#include"sub.h"
void main()
{
	float a,b;
	scanf("&f &f",&a,&b);
	printf("sum: %f\n",x2x(a,b));
	printf("product: %f\n",y2y(a,b));
}

sub.h

#ifndef SUB_H                //防止重定义
#define SUB_H                
float x2x(float a,float b);
float y2y(float a,float b);
#endif

sub1.c

#include<stdio.h>
float x2x(float a,float b)
{
	return a+b;
}

sub2.c

#include<stdio.h>
float y2y(float a,float b)
{
	return a*b;
}

2、编译中间过程的.o目标文件

gcc -c sub1.c sub2.c

此时目录中有以下文件
在这里插入图片描述
3、ar工具建立静态库

ar -crv libsub.a sub1.o sub2.o 

执行完后,在目录中会生成 libsub.a

4、将静态库链接到主程序

gcc-o float -L. main.c –lsub  //方法一,适用于自定义库(最后为l+库名)
gcc main.c libsub.a -o float  //方法二
先生成 main.o: gcc -c main.c    //方法三
再生成可执行文件:gcc -o float main.o libsub.a 

float 即为生成的可执行文件

5、运行结果
在这里插入图片描述
6、删掉静态库文件后再次运行
在这里插入图片描述
可见,删掉静态库后,程序依然可以运行成功,说明静态库中的函数已添加到可执行文件中,程序运行时可不再依赖静态库。

二、gcc建立.so动态库

动态库也叫共享库,文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为 myhello,则动态库文件名就是 libmyh ello.so。注意动态库存放位置

1、继续用 sub1.o 和 sub2.o 建立动态链接库

gcc -shared -fPIC -o libsub.so sub1.o sub2.o

注意命令参数个数
执行后即会生成 libsub.so 文件

2、在程序中链接动态库,此处使用上述的方法二

gcc main.c libsub.so -o float

3、命令执行后会产生可执行文件 float , 运行 float 但会出现以下错误
在这里插入图片描述
这是由于我们虽然使用的是当前目录下的动态库文件,但系统会自动到 /usr/lib 目录下寻找动态库,所以我们需要将库文件移动或复制到该目录下

sudo cp libsub.so /usr/lib

之后再次运行 float
在这里插入图片描述
4、由以上步骤我们可以得知,程序链接到动态库,在运行时是要依赖动态库文件的,如果库文件不在指定目录,程序便不能运行。

三、静态库与动态库的优先级

既然有两种库,自然就要有优先级,如果有同名的静态库与动态库,程序将选择哪一个呢?

1、将刚才复制到 /usr/lib 目录中的动态库文件 与 可执行文件 删掉,然后用方法一链接库与主程序,因为二三种方法会指定库的类型。

cd /usr/lib
sudo rm libsub.so 
cd -
gcc -o float -L. main.c -lsub

2、运行 float
在这里插入图片描述
如图,出现了上文中链接动态库时的问题,所以在有同名库时,系统会自动优先选择动态库。

小结

本文简单的主要介绍了一些Linux中与静态库和动态库相关的基础知识,库的应用在编程过程中是非常重要的,一个灵活高效的库在开发过程中会起到事半功倍的作用。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值