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
在文件夹中发现生成了hello.o文件
3.由.o文件创建静态库
静态库文件名命名规范是以lib为前缀紧接着跟着静态库名,扩展名为.a。例如:我们将创建的而静态库命名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时我们需要注意这点,创建静态库用ar命令。在系统提示符下输入以下命令创建静态库文件libmyhello.a
#ar -crv libmyhello.a hello.o
4.在程序中使用静态库
静态库制作完了如何使用它内部的函数呢?
只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后再gcc命令生成目标文件时指明静态库名字,gcc将会从静态库中将公用函数连接到目标文件中注意gcc会在静态库名前加上前缀lib,然后追加.a得到的静态库文件名来查找静态库文件。
在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello.下面先生成目标程序hello,运行看看结果如何。
方式一:
gcc -o hello main.c -L. -lmyhello
方式二 :
gcc main.c libmyhello .a -o hello
方法三:
先生成main.o
gcc -c main.c
再生成可执行文件
gcc -o hello main.o libmyhello.a
编译创建动态库文件
动态库文件和静态库文件命名方式类似,也是在名字前加前缀lib,后缀便为.so,动态库myhello文件名文libmyhello.so
创建动态库文件。
通过如下命令
gcc -shared -fPIC -o libmyhello.so hello.o-c
2.在程序中使用动态库
使用命令
gcc -o hello main.c -L. -lmyhello
发现由于找不到动态库文件而出错,程序运行时会在/user/lib和/lib中查找需要的动态库文件,如果没找到就会出现上述错误,现在将libmyhello.so复制到目录user/lib中去
发现完美运行
探究
动态库和静态库同名时会优先选择哪个库
将别的文件删除重新创建o和so 文件
一开始会报错,只有将库文件放于usr/lib中才可以运行所以同名的话会优先运行动态库。
编写一个简单的例子程序按照上述方法编译生成库文件,连接运行。
比较静态库和动态库所生成的可执行文件
main.c
sub1.h
sub1.c
sub2.h
sub2.c
1.通过gcc命令生成三个.o文件
2.通过ar命令将sub1和sub2生成一个.a 静态库文件。
3通过命令将main和库文件链接
查看此可生成的文件的大小等信息。
4生成动态库文件并将其添加到usr/lib中,在通过命令将其链接生成可执行文件
观察其文件大小可以发现大小略小于使用静态库生成的可执行文件。