目录
一、分文件编程
简单来说树莓派的分文件编程就是将一个项目的代码放在不同的文件里面,然后在主函数添加一个头文件,这样会使主程序变得简单。
在编译的时候要将主函数和功能函数一起编译
注:include <stdio.h> 和 include "SumSub.h" 的区别:
前者表示引用标准库的头文件,编译时会从系统配置的库环境中去寻找,后者一般为用户自定义的头文件,比如分文件编程中自己定义的头文件,编译系统会从当前文件夹去寻找,如果找不到,则到系统的库文件中去寻找。
Linux中C/C++默认库环境:/usr/include,可使用ls /usr/include 查看
二、Linux函数库
一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)。
1、静态函数库:在程序执行(编译)前就加入到目标程序中去了。
优点: 运行快,发布程序无需提供静态库,因为已经在app中,移植方便
缺点:程序大,链接时完整的拷贝到执行文件中,会有多份冗余拷贝,更新部署麻烦。
2、动态函数库:动态函数库是在程序执行时动态(临时)由目标程序去调用。
优点:程序小,链接时不用复制,程序运行时由系统动态加载到内存中,系统只加载一次,供多个程序共用,节省空间,程序升级简单,升级后只要库名字,函数名以及参数不变,只是做了优化就能加载成功。
缺点:运行慢,加载速度比静态库慢,发布程序需要提供依赖的动态库。
动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
三、库的制作
1、静态库的制作
(1)生成xxx.o文件
gcc SumSub.c -c
这样就生成了SumSub.o文件,注意这里是将功能文件生成.o文件。
(2)将生成的xxx.o文件生成xxx.a文件,也就是静态库文件。
ar rcs libSumSub.a SumSub.o //ar rcs lib + 静态库名.a XXX.o
(3)静态库的使用
gcc main.c -lSumSub -L ./ -o mainProStatic
-lSumSub中 -l是制定要用的动态库,库名去头和尾,-L是告诉gcc编译器从-L制定的路径去找静态库(这里指定gcc编译器先从当前路径去找静态库),不用-L的话就会从默认的/usr/lib 或者/usr/local/lib路径去找静态库。
2、动态库的制作
(1)生成 .so 文件
gcc -shared -fpic SumSub.c -o libSum.so
-shared :生成动态库
-fpic :fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
(2)动态库的使用
gcc main.c -lSumSub -L ./ -o mainProDy
动态库的使用和静态库的使用是一样的,main.c 是整个工程的主函数,SumSub 是去掉 lib 和 .so的动态库,mainProDy 是可执行文件。
注意:动态库这里直接 ./ mainProDy运行的话会出错,因为动态函数库是在程序执行时(临时)由目标程序去调用,所以这里会出错。
这里可以将libSum. so拷贝到 /usr/lib/中去就可以解决,即
sudo cp libSum.so /usr/lib/ //libSum.so拷贝到 /usr/lib/
也可以将文件的路径添加到环境变量中去,但只能临时的使用。
然后在命令行输入以下内容
export LD_LIBRARY_PATH="/home/pi/test"
为了可以在多个窗口都可以使用动态库,可以写一个shell脚本来实现。
1、vi 一个start.sh 文件并在文件中写入下面内容,然后保存退出。
export LD_LIBRARY_PATH="/home/pi/test"
./mainProDy //可执行文件
2、给shell脚本添加可执行的权限
chmod +x start.sh
其中 x 表示可执行,输入 ./start.sh就可以正常运行程序了。
注意:这里是./start.sh运行,不是./mainProDy。