一、分文件编程
优点①功能责任划分②方便调试③主程序简洁
- a.c
#include<stdio.h>//直接到/usr/include或/usr/local/include下找头文件
#include"b.h"//编译时会优先从当前路径下找
int main()
{
int a=5,b=1000;
printf("a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
- b.c
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
- b.h
void swap(int *a,int *b);//函数的声明
最后a.c和b.c一起编译
二、库分为静态库和动态库、共享库
-
静态库
程序再执行之前(编译)就加载到里面去了
-
优点:
快,发布程序时无需提供静态库,因为已经再app中了
-
缺点:
太大,更新、部署、发布麻烦
①静态库的创建
gcc b.c -c //生成b.a文件
ar rcs libb.a b.o //b.o文件生成libb.a静态库文件
②静态库的编译,此例中的staticfile就是可执行文件
gcc a.c -lb -L ./ -o staticfile //-b:是要制定的静态库,库名砍头去尾,-L告诉gcc编译器去指定的路径找静态库,默认是从/usr/lib和/usr/local/lib去找。
-
动态库
动态函数库同共享函数库是一个东西(在linux上叫共享对象库,文件后缀是.so,windows上叫动态加载函数库,文件后缀是.dll);
libname.so.x.y.z,lib:固定代表共享库,name:共享库名称,so:固定后缀,x:主版本号,y:次版本号,z:发行版本号程序加载时动态(临时)加载到目标程序中去
-
优点:
程序升级简单
-
缺点:
加载速度慢,发布程序时需要提供依赖的动态库
①动态库的创建
gcc -shared -fpic b.c -o libb.so//将b.c生成动态库libb.so
说明:
-shared:指定生成动态库
-fpic:标准,fpic选项作用于编译阶段,用于生成目标文件,以生成位置无关的代码
②动态库的编译,与静态库一模一样
gcc a.c -lb -L ./ -o dylib
③动态库的运行
动态库在运行的时候还要找.so文件,而静态库在编译的时候就已经写入程序,
- 方法一:将.so文件拷贝到/usr/lib里面去就可直接运行
- 方法二:环境变量
export LD_LIBRARY_PATH=“.so库的绝对路径”
但这种方法只是临时的,换到其他目录就不行了,因此我们可以做一个shell
脚本:
vi start.sh, 再写入export=LD_LIBRARY_PATH=".so库的绝对路径";
chmod +x start.sh//加入可执行权限
./start.sh//运行