分文件编程 动态库和静态库
一、分文件编程
好处:
分模块的编程思想
1.功能责任划分明确
2.方便调试
3.主程序简洁
例子:下面有一个程序:calculatorT.c
#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
int min(int x,int y)
{
return x-y;
}
int mul(int x,int y)
{
return x*y;
}
float dev(int x,int y)
{
return (float)x/y;
}
int main()
{
int data1=0;
int data2=0;
int ret=0;
float retfloat=0;
printf("请输入加数1\n");
scanf("%d",&data1);
printf("请输入加数2\n");
scanf("%d",&data2);
ret=add(data1,data2);
printf("%d+%d=%d\n",data1,data2,ret);
ret=min(data1,data2);
printf("%d-%d=%d\n",data1,data2,ret);
ret=mul(data1,data2);
printf("%d*%d=%d\n",data1,data2,ret);
retfloat=dev(data1,data2);
printf("%d/%d=%.2f\n",data1,data2,retfloat);
return 0;
}
用分文件编程重构,如下:
主程序:calculatorT.c
#include<stdio.h>
#include"calcufuns.h"
int main()
{
int data1=0;
int data2=0;
int ret=0;
float retfloat=0;
printf("请输入加数1\n");
scanf("%d",&data1);
printf("请输入加数2\n");
scanf("%d",&data2);
ret=add(data1,data2);
printf("%d+%d=%d\n",data1,data2,ret);
ret=min(data1,data2);
printf("%d-%d=%d\n",data1,data2,ret);
ret=mul(data1,data2);
printf("%d*%d=%d\n",data1,data2,ret);
retfloat=dev(data1,data2);
printf("%d/%d=%.2f\n",data1,data2,retfloat);
return 0;
}
把功能函数放在另一个文件:calcufuns.c
int add(int x,int y)
{
return x+y;
}
int min(int x,int y)
{
return x-y;
}
int mul(int x,int y)
{
return x*y;
}
float dev(int x,int y)
{
return (float)x/y;
}
给功能函数再做一个h文件放在主程序里,防止编译报错
calcufuns.h
扫描二维码关注公众号,回复:
16977628 查看本文章
int add(int x,int y);
int min(int x,int y);
int mul(int x,int y);
float dev(int x,int y);
以上就完成了分文件编程,
二、动态库与静态库
2.1动态库
1.动态库:是在程序执行时动态(临时)有目标程序调用
缺点:运行慢
优点:程序小
动态库的命名规则:前缀为lib,后缀为.so
2.动态库的制作:
生成.o,加一个fpic
gcc -shared -fpic calcufuncs.c -o libcalc.so
-shared 指定生成动态库
-fpic 标准
- 动态库的使用:
gcc calculatorT.c -lcalc -L ./ -o mianProDy
如果这个时候编译出错,采用下面的解决方法
1.临时有效
sudo cp libcalc.so /usr/lib/
拷到默认路径
2.永久有效
export: 列出系统中的环境变量
pwd:列出当前的路径
export LD_LIBRARY-PATH="/home/pi/back/test";
(带动态库的程序可以指定该程序运行的时候,在LD_LIBRARY_PATH所指定的路径去找库文件)
du指令:计算文件大小
2.2静态库
1.静态库:在程序(编译)执行前就加入到目标程序去
缺点:程序大 优点:运行快
2.静态库的制作
格式:xxx.a(以a结尾)
a:gcc calcufuncs.c -c 生成.o文件
b:rcs libcalcufunc.a calcufuncs.o (xxx.o文件生成xxx.a文件)
3.静态库的使用
保留静态库和.h文件
编译时:
gcc calculatorT.c -lcalcufunc
如果编译出错,优先从标准库找
所以改为
gcc calculatorT.c -lcalcufunc -L ./
(优先从当前目录找,找不到再到标准库找)