分文件编程
1.分文件编程介绍
分文件的编程其实可以理解为多个文件进行的编程
把文件通过功能进行分类 大大提高文件的可读性
比如功能有 网络 串口 超声波 电机等 通过分文件编程的方式把这些功能整合在一起 实现一个具体的大工程,类似于STM32的编程方式
可以让主函数变得简洁
2.分文件编程的例子
分文件编程 表示的是主函数的程序中用的函数
例如 在dema1中
#include <stdio.h>
#include "dema2.h"
int main()
{
int t1;
int t2;
int jia;
printf("请输入第一个数:");
scanf("%d",t1);
printf("请输入第二个数:");
scanf("%d",t2);
printf("加数总和是:%d",jia=jia1(t1,t2));
return 0;
}
在dema2中写函数的代码
#include "dema2.h"
int jia1(int i,int y)
{
return i+y;
}
主函数要引用dema2的函数需要dema2.h文件
进行函数的声明
#ifndef __DAMA2_H
#define __DAMA2_H
int jia1(int i,int y); //特别注意这里要加分号
#endif /* 使用宏定义判断*/
防止宏定义重复使用 头文件重复调用
#ifndef
#define
#endif
3.重要提示
头文件是 <> 默认去/usr/include
或者 /usr/local/include 下面去查找
我们自己写的头文件 " " 默认在当前目录下面寻找 当前目录的绝对路径寻找
静态库动态库引入
库
库是可执行代码的二进制形式,就是将源代码转换成二进制的源代码,相当于对源代码进行了加密,别人可以看见库,但是看不见源代码
使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
静态函数库
静态库在程序执行前就加入到了程序中
优点:运行快
发布前无需提供静态库,因为已经在文件当中
缺点:占用内存大
1.链接完整拷贝至可执行文件中,多次拷贝就会产生重复拷贝
2.更新、部署、发布麻烦。
每次更新都需要发送给使用者
动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
linux中文共享库命名规则
动态库
优点:
1。链接复制时,不使用,程序执行时临时调用,由x系统动态加载到内存,系统只执行一次,并且可以多次调用
2。程序升级简单,因为程序里面没有库的源码,升级之后只要库的名字不变函数的名字不变参数不变,只是实现做优化,知道成功
缺点:
加载的速度比静态库慢
发布程序需要依赖动态库
因为程序执行是临时调用动态库,所以需要依赖动态库,才能进行程序的运行
1.静态库创建
主函数是可以看到的 但是一些功能模块的代码不希望别人看到 我们就要把这些功能对应的.c 文件 创建静态库文件
使用gcc dema.c -c 生成.o 文件
然后把.o 文件生成静态库文件
使用ar rcs 指令生成静态库文件 .a 表示静态文件
创建静态库
gcc dema2.c -c //生成.o文件
ar rcs libtestfunc.a dema2.o //生成libtestfunc.a文件
后面的.o 表示要使用的功能文件 .o 可以多个
2.静态库的使用
/lib里面给的是root和内核所需so或者a之类的库文件,而/usr/lib是普通用户能够使用的 更多用于用户的库文件 .a等
-l指定所需的静态库 类似于pthread等
-L让 gcc在指定的目录下面寻找 默认情况下 是在usr/lib下面进行查找
gcc dema1.c -ltestfunc -L./
//-L表示让gcc从-L指定的目录寻找 默认在usr/lib 或者usr/local/lib里面寻找
//-l是指定要用的静态库 掐头去尾只留下testfunc lib去掉 .a去掉
//gcc 默认到use/lib里面寻找文件 通过-L./把它定为到当前目录
动态库
1.创建动态库
生成.so文件 so动态 o静态
gcc -shared -fpic xxxx.c -o libde2ma.so
-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
2.动态库的使用
gcc dema1.c -lde2ma -L ./ -o mainProDy
主函数 掐头去尾
libde2ma.so -L ./ 定位到当前目录
cat 查看
只能在当前的窗口中使用该临时的环境变量 在其他的窗口下面无法使用
表示的是临时的环境变量
export LD_LIBRARY_PATH="/home/pi/back/test"
export 使用这个宏定义 定位到这个文件目录 需要使用""
创建脚本文件 shell
创建 vi start.sh sh文件是脚本文件
这样每次使用的时候就不用重新定义临时环境
export LD_LIBRARY_PATH="/home/pi/back/test"
./demaDy
//可执行文件
给脚本添加可执行权限
chmod +x start.sh //给脚本文件一个可执行权限x
./start.sh 和可执行文件一样
du 指令 计算文件大小