栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Ubuntu16.04系统下静态库.a和动态库.so文件的生成及使用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Ubuntu16.04系统下静态库.a和动态库.so文件的生成及使用

         

目录

一、库       

        1) 概念

        2) 规则

二、编译时链接静态库文件

       1) 源程序

       2) 编译静态库文件libx2.a

       3) 链接为可执行文件main

三、 编译时链接动态库文件

       1)编译动态库文件libx2.so

       2)链接为可执行文件

       3)链接静态库与动态库生成可执行文件的对比

四、总结

五、 参考内容


一、库

1)概念

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。

~ 静态库:在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。
~动态库:在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

2)规则

  • 静态库
  • 静态库的名字一般为libxxx.a,其中xxx是该lib的名称。
  • 动态库
  • 动态库的名字一般为libxxx.so.major.minor,xxx是该lib的名称,major是主版本号, minor是副版本号。
 二、编译时链接静态库文件

1)源程序

① 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;
}

③ sub.h

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

④ main.c

#include
#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=%.2fn",x2x(a,b));
	printf("a/b=%.2fn",x2y(a,b));
}

将这些代码文件放在同一个文件夹zuoye当中

  2)编译静态库文件libx2.a

接下来,gcc编译得到.o文件

gcc -c sub1.c sub2.c main.c

创建静态库     

工具: ar

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

  3) 链接为可执行文件main

使用以下命令链接main.o和libx2.a文件生成可执行文件main 

gcc main.o libx2.a -o main

执行可执行文件main,可得最终结果

./main

 测试是否真的静态库链接成功
删除静态库libx2.a目标文件,再次执行该可执行文件

rm libx2.a
ll
./main

 以上说明静态库链接生成的可执行文件运行时不需要该静态库,因为该静态库已经被编译到可执行文件中了。

三、 编译时链接动态库文件

1)  编译动态库文件libx2.so

.o目标文件已经在上面编译静态库文件时生成了,因此这里直接编译动态库文件。

使用以下命令编译生成动态库文件libx2.so:

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

 2)  链接为可执行文件

使用以下命令链接两个目标文件生成可执行文件main

gcc main.o libx2.so -o main
ll

 执行文件时发现有错误,

原因:
程序在运行时, 会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
解决方法:
将libx2.so 复制到目录/usr/lib 中,再次执行./main运行(若提示权限不够则以使用sudo mv libx2.so /usr/lib该命令)

3)链接静态库与动态库生成可执行文件的对比 

 首先,在使用两种不同类型的库生成可执行文件,并执行时,动态库执行过程中有一定的错误,相对麻烦,其次,静态库生成的可执行文件为7528字节,动态库生成的可执行文件为7492字节。从而可见动态库生成的可执行文件要比静态库生成的要更小,但是链接动态库需要依赖于该动态库。

四、总结

通过此次关于使用静态库和动态库分别链接生成可执行文件main的实验,我了解到了不同库函数的链接的作用是不一样的。静态库链接是直接在程序编译时就将其组装到一起,可以不依赖于静态库就能运行;而动态库链接是在程序运行时才将其载入内存运行且不能够缺少,否则不能运行。总之,只用多加练习,才能更好的应用它们。文章如有不妥之处,请指出。

五、 参考内容

(1条消息) gcc分别链接静态库和动态库生成可执行文件_不#曾&轻听的博客-CSDN博客

(1条消息) gcc生成静态库.a和动态库.so_Harriet的博客-CSDN博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/310877.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号