1.Linux库引入之分文件编程
Linux库概念及相关编程
-
分文件编程案列
好处:分模块的编程思想
按照功能编程
功能、责任能分清楚,方便调试、主程序简洁
-
库
- 静态库:静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
- 优点:运行快,发布程序时无需提供静态库,移植方便
- 缺点:程序大,更新、部署、发布麻烦
- 动态库:动态函数库,是在程序执行时动态(临时)由目标程序去调用
- 缺点:运行慢
- 程序小
- 静态库:静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
-
库的制作
-
库的使用
按功能编程:
demo1.c
#include <stdio.h>
#include "operationfuns.h"
int main()
{
int data1 = 0;
int data2 = 0;
printf("please input first number\n");
scanf("%d",&data1);
printf("please input second number\n");
scanf("%d",&data2);
printf("add: data1 + data2 = %d\n",addfunction(data1,data2));
printf("subtraction: data1 + data2 = %d\n",subfunction(data1,data2));
printf("multiplication: data1 + data2 = %d\n",mulfunction(data1,data2));
printf("division: data1 + data2 = %.2f\n",divfunction(data1,data2));
return 0;
}
operationfuns.c
int addfunction(int data1,int data2)
{
return data1+data2;
}
int subfunction(int data1,int data2)
{
return data1 - data2;
}
int mulfunction(int data1,int data2)
{
return data1*data2;
}
float divfunction(int data1,int data2)
{
return (float)data1/data2;
}
operationfuns.h
int addfunction(int data1,int data2);
int subfunction(int data1,int data2);
int mulfunction(int data1,int data2);
float divfunction(int data1,int data2);
demo1.c
为主函数,其他功能文件(operationfuns.c
)一起编译
gcc demo1.c operationfuns.c
2.Linux库引入动态静态库
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
1、静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
2、动态函数库同*共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, ****文件后缀是****.dll)*
Linux中命名系统中共享库的规则
- 静态函数库
静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀。可以用ar这个程序来产生静态函数库文件。Ar是archiver的缩写。静态函数库现在已经不在像以前用得那么多了,主要是共享函数库与之相比较有很多的优势的原因。慢慢地,大家都喜欢使用共享函数库了。不过,在一些场所静态函数库仍然在使用,一来是保持一些与以前某些程序的兼容,二来它描述起来也比较简单。
静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间。不过,在今天这么快速的计算机面前,一般的程序的重新编译也花费不了多少时间,所以这个优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库(或者动态函数库)的程序运行速度上快一些,大概1-5%。
创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码,可以用下面的命令:
ar rcs my_library.a file1.o file2.o
这个例子中是把目标代码file1.o和file2.o加入到my_library.a这个函数库文件中,如果my_library.a不存在则创建一个新的文件。在用ar命令创建静态库函数的时候,还有其他一些可以选择的参数,可以参加ar的使用帮助。这里不再赘述。
一旦你创建了一个静态函数库,你可以使用它了。你可以把它作为你编译和连接过程中的一部分用来生成你的可执行代码。如果你用gcc来编译产生可执行代码的话,你可以用“-l”参数来指定这个库函数。你也可以用ld来做,使用它的“-l”和“-L”参数选项。具体用法可以参考info:gcc。
- 共享函数库
共享函数库中的函数是在当一个可执行程序在启动的时候被加载。如果一个共享函数库正常安装,所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数。对于Linux系统还有更多可以实现的功能:
1、升级了函数库但是仍然允许程序使用老版本的函数库。
2、当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数。
3、可以在库函数被使用的过程中修改这些函数库。
3.Linux库之静态库的生成和使用
不想给被人看代码 但要给被人用
- 命名规则
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
- 制作步骤
原材料:源代码.c 或者 .cpp
将.c文件生成.o,gcc a.c b.c -c (生成xxx.o文件)
将.o 打包
ar rcs 静态库的名字 原材料
ar rcs libtest.a a.o b.o (xxx.o文件生成静态库文件xxx.a)
尽量使用lib开头
ar(不认识的) --hlep:查看帮助
给别人使用时,给xxx.h和xxx.a文件就行了
mv xxxx.* ~(将所有xxxx文件(.c .o .h等等)移到工作目录下(~ 也就是raspberrypi))
3.静态库的使用
gcc test.c -I ./include -L./lib -lmycalc -o app
-I(大写i):指定头文件的路径
-L: 指定库的路径
-l(小写L):指定库的名字(去掉lib和.a)
-o:指定生成的最终应用程序的名字
gcc demo1.c -loperation -L ./ (-l :制定要用的静态库,库名称去掉lib 和.a(会默认去/usr/lib/中去找) -L ./:制定路径 ./:当前文件)
4.Linux库之动态库的生成和使用
1.命名规则
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so”
2.制作步骤
第一种:
gcc -shared -fpic xxxx.c -o libxxx.so
-shared :制定生成动态库
-fpic: 一种标准,fpic选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
第二种:
将源文件生成.o,需要加一个参数fpic
-
gcc a.c b.c -c -fpic(fPIC) (生成xxx.a=o.文件)
-
打包,gcc -shared a.o b.o -o libxxx.so
-
动态库的使用
gcc demo1.c -loperationfuns -L ./ -o demo1_dy
使用与静态库大同小异
在运行demo1_dy
时会报错:
因为动态库的使用是在程序执行时动态(临时)由目标程序去调用(静态库在程序执行前(编译)就加入到目标程序中去了 )
解决:
export:查看环境变量
通过添加环境变量:export LD_LIBRARY_PATH="路径"
pwd:查看当前路径 (此方法只是临时添加环境变量,重开窗口或者重启就失效了)
可写一个脚本存放:
vi start.sh
export LD_LIBRARY_PATH="/home/pi/Demo"
./demo1_dy
chmod +x start.sh
chmod命令:+x改变文件权限 :添加可执行权限
du demo1_dy
计算文件大小
下面展示一些 内联代码片
。