分文件编程
分文件编写(模块化编程)的含义是将一个程序的代码分多个文件存储,也就是将不同的功能模块放在不同的文件中,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。
主要含有三个部分:
后缀为 .h 的头文件 (函数声明)
后缀为 .c 的源文件(函数实现)
后缀为 .c 的main函数主源文件(程序运行的入口)
编译:gcc xx.c xxx.c -o xx就可以了
注意:主函数源文件需要包含头文件 #include " xxxx.h "
你要用这个函数当然得和它打声招呼吧,之后就直接调用即可
例子:
calculator.h
int add(int data1,int data2);
int minus(int data1,int data2);
int multiply(int data1,int data2);
float division(int data1,int data2);
calculator.c
int add(int data1,int data2)
{
int ret;
ret = data1+data2;
return ret;
}
int minus(int data1,int data2)
{
int ret;
ret = data1-data2;
return ret;
}
int multiply(int data1,int data2)
{
int ret;
ret = data1*data2;
return ret;
}
float division(int data1,int data2)
{
float ret;
ret = (float)data1/data2;
return ret;
}
test.c
#include <stdio.h>
#include "calculator.h"
int main()
{
int data1;
int data2;
printf("Please input NO.1:");
scanf("%d",&data1);
printf("Please input NO.2:");
scanf("%d",&data2);
printf("add:%d\n",add(data1,data2));
printf("minus:%d\n",minus(data1,data2));
printf("multiply:%d\n",multiply(data1,data2));
printf("division:%f\n",division(data1,data2));
}
库的介绍
使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
1、静态函数库,是在程序执行前就加入到目标程序中去了 ;
2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
Linux中命名系统中共享库的规则
静态库的制作与使用
在 Linux 中静态库以 lib 作为前缀,以.a 作为后缀,中间是库的名字自己指定即可,即: libxxx.a
静态库的制作:格式libxxx.a
1.gcc calculator.c -c 生成xxx.o文件
2.ar rcs libcalculator.a calculator.o xxx.o文件生成libxxx.a静态库文件
静态库怎么使用?
gcc test.c -lcalculator -L ./ -o maninProStatic
-l:是制定要用的动态库,库名砍头去尾
-L:告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib /usr/local/lib去找
-o:给生成的可执行文件命名
动态库的制作与使用
在 Linux 中动态库以 lib 作为前缀,以.so作为后缀,中间是库的名字自己指定即可,即: libxxx.so
1.gcc -shared -fpic calculator.c -o libcalculator.so
-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
动态库怎么使用?
gcc test.c -lcalculator -L ./ -o mainProDy
-l:是制定要用的动态库,库名砍头去尾
-L:告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib /usr/local/lib去找
-o:给生成的可执行文件命名
没找到动态库报错
(注意:要正常使用该可执行文件,要把生成的libxxx.so拷贝到/usr/lib /usr/local/lib里面去,或者使用下面临时增加环境指定路径去找)
带动态库的程序,
可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
例子:
export LD_LIBRARY_PATH=“/home/lhq/demo”
也可以写一个脚本去执行:
动静态库的优缺点
a)静态库
静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
优点: 运行快
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:大
b)动态库
动态函数库,是在程序执行时动态(临时)由目标程序去调用
缺点: 运行慢
优点: 小