linux下创建静态库和动态库
普及知识
1.静态库的好处
由于我们做技术的价值就是核心的代码编写,所以我们一般后期都会把文件用静态库或者动态库的形式封装起来,这样我们只用给头文件和库文件这样就够了。这使我们的源码
得到了一定程度上的保护。
2.windows和linux的库文件
windows上面由于vs的强大很多的功能都可以在上面直接点击或者配置一些信息就可以生成,在这里我就不必多说,不会的可以自行的去百度,我在这里普及一下linux和
windows上的文件对比,win上面的lib在linux上面是.a文件,win上面的.dll文件在linux上是.so文件,这是两个系统中文件的不同。
命令的使用
1.gcc
大家都晓得在linux下面编写c语言代码,编辑以后我们要使用的工具就是gcc,如果只有几个文件没有形成模块的话我们都使用gcc做简单的编辑,连接,和运行。在这里我默认
大家会基本使用gcc来编译c语言代码。然后他的常见的参数 -o,-c默认大家都是知道的。
2.静态库的命令
ar rcs命令
3.动态库的命令
gcc shared fPIC命令
代码
1.准备好写的代码结构
一个include文件夹他用来存放.h文件,一个lib文件夹我们知道库的文件夹,还有一个就是src他就是代码文件夹。
头文件
head.h
#ifndef __HEAD_H_
#define __HEAD_H_
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
#endif
我就定义了三个函数,分别是加减乘除四种运算,这样我们做一个简单的计算器的的库。
实现函数
add.c
#include "head.h"
int add(int a, int b)
{
int result = a + b;
return result;
}
sub.c
#include "head.h"
int sub(int a, int b)
{
int result = a - b;
return result;
}
mul.c
#include "head.h"
int mul(int a, int b)
{
int result = a * b;
return result;
}
div.c
#include "head.h"
int div(int a, int b)
{
int result = a / b;
return result;
}
现在我们加减乘除都已经有实现的代码了,然后我们进入src这个文件夹中进行.c的文件的编译
命令是:gcc *.c -c -I ../include 这句话的意思就是把src下面的所有.c文件都编译成.o文件,执行以后我们可以用ls查看一下文件夹下都多出了.o文件。
刚才我们讲过有一个ar 的命令现在我们就派上用场的其命令如下。
ar rsc libMyCalc.a *.o 现在我们任然是在src下面,我们这个命令就把所有的.o文件全部打包成了libMyCalc.a文件了由此我们就打包成了静态库。然后我们在src 下面ls查看一下
发现确实是多了一个libMyCalc文件,然后我们用mv命令把这个文件移动到lib,其命令就是mv libMyCalc.a ../lib这样我们就顺利的把文件移动到lib文件下面。最后一步就是用一
个测试文件来测试我们的库文件。
main.c测试代码
#include <stdio.h>
#include "head.h"
int main(void)
{
int sum = add(2, 24);
printf("sum = %d\n", sum);
return 0;
}
然后保存vim最后用一个打包以后的命令进行测试
gcc main.c lib/libMyCalc.a -I include
得出sum = 26
测试成功
动态库
由于动态库和静态库的区别在于编译的时候的一个命令。
我们把src下面的所有.o文件全部删除,首先进入src文件 然后用rm *.o这样就全部删除了。
gcc -fPIC -c *.c -I ../include
这样我们就可以看到动态连接的库文件生成.o
然后执行命令
gcc -shared -o libMyCalc.so *.o -I ../include
然后我们就生成了libMyCalc.so
后面的命令就和静态库的差不多。
总结
生成库文件就两个方面
1.编译成.o文件
2.把编译好的.o文件打包成我们需要的so 和 a文件