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

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

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

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

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

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

#ar -crv libmyhello.a hello.o

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

4.在程序中使用静态库

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

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

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

方式一:

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

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

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

方式二 :

gcc main.c libmyhello .a -o hello

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

方法三:

先生成main.o

gcc -c main.c

再生成可执行文件

gcc -o hello main.o libmyhello.a

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

编译创建动态库文件

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

创建动态库文件。

通过如下命令

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

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

2.在程序中使用动态库

使用命令

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

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

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

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

发现完美运行

探究

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

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

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

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

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

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

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

main.c

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

sub1.h

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

sub1.c

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

sub2.h

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

sub2.c

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

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

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

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

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

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

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

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

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

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

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

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

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

上一篇:学校公文办公处理系统_基于ASP.NET和Swfupload、FlashPaper2.2、校讯通短信发送的开发


下一篇:Linux GCC常用命令以及GCC编译器的初步学习