0


用gcc生成静态库和动态库以及静态库.a与.so库文件的生成与使用

文章目录

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

1.编辑生成hello.h、hello.c和main.c

输入命令:

mkdir test1
cd test1

创建作业目录,保存文件。
在这里插入图片描述

(1).生成hello.h、hello1.c、main.c

输入命令:

vim hello.h

,再输入i进入编辑模式,输入以下命令:
在这里插入图片描述
编辑完成后,先按esc,再按:wq保存并退出。

(2).生成hello.c

同理,先进入vim编辑模式,输入以下代码后,保存并退出。
在这里插入图片描述

(3)生成main.c

和(1)类似,先进入vim编辑模式,再输入以下代码后,保存并退出。
在这里插入图片描述

2.将hello1.c编译成.o文件

无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件,在系统提示符下键入以下命令得到hello.o文件。>

输入命令:

gcc -c hello.c

即可得到hello.o文件,运行:

ls

命令查看是否生成hello.o文件:
在这里插入图片描述

3.由.o文件创建静态库

静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库命名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。

输入命令:

ar -crv libmyhello.a hell.o

创建静态库文件libmyhello.a。
输入命令:

ls

查看是否生成了该文件
在这里插入图片描述

4.在程序中使用静态库

静态库制作完成之后,要使用静态库内部的函数,就需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明静态库名,gcc 将会从静态库中将公用函数连接到目标文件中。注意,gcc 会在静态库名前加上前缀 lib,然后追加扩展名.a 得到的静态库文件名来查找静态库文件。在程序 3:main.c 中,我们包含了静态库的头文件 hello.h,然后在主程序 main 中直接调用公用函数 hello。

下面先生成目标程序hello,然后运行hello程序,查看结果:
输入命令:

gcc -o hello main.c -L. -lmyhello

在这里插入图片描述

自定义库时,main.c 还可放在-L.和 –lmyhello 之间,但是不能放在它俩之后,否则会提示 myhello 没定义,但是是系统的库时,如 g++ -o main(-L/usr/lib) -lpthread main.cpp就不出错。

我们删除静态文件路文件试试公用函数hello是否真的连接到目标文件hello中了。

程序照常运行,静态库中的公用函数已经连接到目标文件中了。

5.由.o文件创建动态库文件

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是 libmyh ello.so。用 gcc 来创建动态库。

输入以下命令:在这里插入图片描述
得到动态库文件libmyhello.so.

6.在程序中使用动态库

在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。

我们先运行 gcc 命令生成目标文件,再运行它看看结果。
在这里插入图片描述
错误提示找不到动态库文件libmyhello.so。
原因:

程序在运行时,会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。

此时,我们将文件 libmyhello.so 复制到目录/usr/lib 中。
在这里插入图片描述
成功了,说明在程序运行时是需要动态库的。

二、静态库.a与.so库文件的生成与使用

(1).输入命令:

mkdir test2
cd test2

创建作业目录,保存文件。
在这里插入图片描述

(2).使用vim生成编译A1.c
在这里插入图片描述
(3).使用vim生成编译A2.c
在这里插入图片描述
(4).使用vim生成编译A.h
在这里插入图片描述

(5).使用vim生成编译test.c

在这里插入图片描述

1.静态库.a的生成与使用

1.1.生成目标文件

输入命令:

gcc -c A1.c A2.c

输入

ls

查看:
在这里插入图片描述

1.2.生成静态库.a文件

输入命令:

ar crv libfile.a A1.o A2.o

:
在这里插入图片描述

1.3.使用.a库文件,创建可执行程序

在这里插入图片描述

2.静态库.so库文件的生成与使用

2.1.生成目标文件:

在这里插入图片描述

2.2.生成共享库.so文件

在这里插入图片描述

2.3.使用.so库文件,创建可执行程序

在这里插入图片描述

三、程序改编

1.相应程序

sub1.c
在这里插入图片描述
sub2.c
在这里插入图片描述
sub.h
在这里插入图片描述
main.c
在这里插入图片描述
输入命令查看:
在这里插入图片描述

2.生成静态库文件

在这里插入图片描述

3.生成动态库文件

在这里插入图片描述

4.静态库与动态库的比较

4.1.静态库

在这里插入图片描述

4.2.动态库

在这里插入图片描述

5.静态库与动态库文件的比较

由上图可知,静态库生成文件比动态库文件要小,其生成的可执行文件大小相差无几。

三、总结

此过程比较繁琐,需要耐心,对于一些命令的空格、符号等需要谨慎输入。

四、参考链接

https://blog.csdn.net/qq_43279579/article/details/109026927

标签: github linux 运维

本文转载自: https://blog.csdn.net/qq_52099780/article/details/127033110
版权归原作者 暮光烬凉 所有, 如有侵权,请联系我们删除。

“用gcc生成静态库和动态库以及静态库.a与.so库文件的生成与使用”的评论:

还没有评论