GCC生成静态库.o以及动态库.so文件及其使用学习

编译生成静态库文件

1.编辑生成例子程序hello.h,hello.c,main.c

hello.c是函数库的源程序,其中包括公用函数hello,该函数将在屏幕上输出(hello XXX)

hello.h为该函数库的头文件,main.c为测试库的主程序。在主程序中调用函数hello

程序1:hello.h

#ifndef HELLO_H

#define HELLO_H

void hello(const char*name)

#endif//HELLO_H

程序2 :hello.c

#include<stdio.h>

void hello(const char *name)

{	

​	printf("Hello %s!\n",name);

}

程序3 :main.c

#include "hello.h"

int main()

{

​	hello("everyone");

​	return 0;

}

2,将hello.c编译成.o文件

无论是静态库还是动态库都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件

输入命令 gcc -c hello.c

1634361769552

在文件夹中发现生成了hello.o文件

1634361787501

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

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

#ar -crv libmyhello.a hello.o

1634362224672

4.在程序中使用静态库

静态库制作完了如何使用它内部的函数呢?

只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后再gcc命令生成目标文件时指明静态库名字,gcc将会从静态库中将公用函数连接到目标文件中注意gcc会在静态库名前加上前缀lib,然后追加.a得到的静态库文件名来查找静态库文件。

在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello.下面先生成目标程序hello,运行看看结果如何。

方式一:

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

1634362711027

1634362762604

方式二 :

gcc main.c libmyhello .a -o hello

1634362810880

方法三:

先生成main.o

gcc -c main.c

再生成可执行文件

gcc -o hello main.o libmyhello.a

1634362954444

编译创建动态库文件

动态库文件和静态库文件命名方式类似,也是在名字前加前缀lib,后缀便为.so,动态库myhello文件名文libmyhello.so

创建动态库文件。

通过如下命令

gcc -shared -fPIC -o libmyhello.so hello.o-c

1634363826891

2.在程序中使用动态库

使用命令

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

1634363953056

发现由于找不到动态库文件而出错,程序运行时会在/user/lib和/lib中查找需要的动态库文件,如果没找到就会出现上述错误,现在将libmyhello.so复制到目录user/lib中去

1634364227661

发现完美运行

探究

动态库和静态库同名时会优先选择哪个库

1634399234559

将别的文件删除重新创建o和so 文件

1634399331831

一开始会报错,只有将库文件放于usr/lib中才可以运行所以同名的话会优先运行动态库。

编写一个简单的例子程序按照上述方法编译生成库文件,连接运行。

比较静态库和动态库所生成的可执行文件

main.c

1634400186327

sub1.h

1634400207335

sub1.c

1634400225949

sub2.h

1634400246854

sub2.c

1634400274536

1.通过gcc命令生成三个.o文件

1634400510313

2.通过ar命令将sub1和sub2生成一个.a 静态库文件。

1634400618796

3通过命令将main和库文件链接

1634400789363

查看此可生成的文件的大小等信息。

1634400820439

4生成动态库文件并将其添加到usr/lib中,在通过命令将其链接生成可执行文件

1634401375372

观察其文件大小可以发现大小略小于使用静态库生成的可执行文件。

1634401423331

posted @ 2021-10-17 10:44  Sioalq  阅读(2629)  评论(0编辑  收藏  举报
Live2D