Linux的.a静态库与.so动态库的建立
我们在使用每一种编程语言时都会遇到函数库的概念,只需要添加某个头文件,就可以调用其中提供的各种函数接口,简单便捷的实现多种功能。本文将向大家介绍在linux系统中,如何建立C语言的静态函数库和动态函数库。
一、gcc建立.a静态库
静态库在程序编译时会被链接到目标代码中,在程序运行时便不再需要相应静态库文件。
1、创建相关源文件
主程序main.c 、求和sub1.c 、乘积sub2.c 、主函数头文件sub.h
main.c
#include"stdio.h"
#include"sub.h"
void main()
{
float a,b;
scanf("&f &f",&a,&b);
printf("sum: %f\n",x2x(a,b));
printf("product: %f\n",y2y(a,b));
}
sub.h
#ifndef SUB_H //防止重定义
#define SUB_H
float x2x(float a,float b);
float y2y(float a,float b);
#endif
sub1.c
#include<stdio.h>
float x2x(float a,float b)
{
return a+b;
}
sub2.c
#include<stdio.h>
float y2y(float a,float b)
{
return a*b;
}
2、编译中间过程的.o目标文件
gcc -c sub1.c sub2.c
此时目录中有以下文件
3、ar工具建立静态库
ar -crv libsub.a sub1.o sub2.o
执行完后,在目录中会生成 libsub.a
4、将静态库链接到主程序
gcc-o float -L. main.c –lsub //方法一,适用于自定义库(最后为l+库名)
gcc main.c libsub.a -o float //方法二
先生成 main.o: gcc -c main.c //方法三
再生成可执行文件:gcc -o float main.o libsub.a
float 即为生成的可执行文件
5、运行结果
6、删掉静态库文件后再次运行
可见,删掉静态库后,程序依然可以运行成功,说明静态库中的函数已添加到可执行文件中,程序运行时可不再依赖静态库。
二、gcc建立.so动态库
动态库也叫共享库,文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为 myhello,则动态库文件名就是 libmyh ello.so。注意动态库存放位置
1、继续用 sub1.o 和 sub2.o 建立动态链接库
gcc -shared -fPIC -o libsub.so sub1.o sub2.o
注意命令参数个数
执行后即会生成 libsub.so 文件
2、在程序中链接动态库,此处使用上述的方法二
gcc main.c libsub.so -o float
3、命令执行后会产生可执行文件 float , 运行 float 但会出现以下错误
这是由于我们虽然使用的是当前目录下的动态库文件,但系统会自动到 /usr/lib 目录下寻找动态库,所以我们需要将库文件移动或复制到该目录下
sudo cp libsub.so /usr/lib
之后再次运行 float
4、由以上步骤我们可以得知,程序链接到动态库,在运行时是要依赖动态库文件的,如果库文件不在指定目录,程序便不能运行。
三、静态库与动态库的优先级
既然有两种库,自然就要有优先级,如果有同名的静态库与动态库,程序将选择哪一个呢?
1、将刚才复制到 /usr/lib 目录中的动态库文件 与 可执行文件 删掉,然后用方法一链接库与主程序,因为二三种方法会指定库的类型。
cd /usr/lib
sudo rm libsub.so
cd -
gcc -o float -L. main.c -lsub
2、运行 float
如图,出现了上文中链接动态库时的问题,所以在有同名库时,系统会自动优先选择动态库。
小结
本文简单的主要介绍了一些Linux中与静态库和动态库相关的基础知识,库的应用在编程过程中是非常重要的,一个灵活高效的库在开发过程中会起到事半功倍的作用。