观看学习上官可编程陈立臣老师的树莓派视频,
在其过程中所记录的学习笔记
1.分文件编程
分模块的编程思想
a.功能责任划分
b.方便调试
c.主程序简洁
2.函数库概念
函数库可以分为:静态函数库、共享函数库、动态加载库;
共享函数库和动态加载库实际上是同一个
Linux中称为共享函数库,以so为后缀,
Windows中称为动态加载库,以dll为后缀
静态库,是在程序执行前(链接)就加入到目标程序中去
优点:运行速度快
发布程序时可以不用提供静态库,因为已经在链接时加入目标程序中
缺点:链接使得可执行文件中包含了完整的库代码,多次使用就会有多份冗余拷贝
更新、部署、发布程序复杂
动态库,是在程序执行时动态加载到内存,供目标程序调用
优点:链接时不拷贝库代码,程序运行时才动态加载到内存,供目标程序调用,不用多次加载,可以节省内存空间
更新、部署、发布程序简单
缺点:运行速度快
发布程序时需要提供动态库
3.库的制作
静态库的制作:命名格式为libxxx.a
gcc xxx.c -c (生成xxx.o文件)
ar rcs libxxx.a xxx.o (xxx.o文件生成libxxx.a静态库文件)
动态库的制作:命名格式为libxxx.so
gcc -shared -fpic xxx.c -o libxxx.so (xxx.c文件生成libxxx.so动态库文件)
-shared 指定生成动态库
-fpic 作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
4.库的链接
静态库:
gcc main.c -lxxx -L ./ -o xxx
例:gcc main.c -lcalcufunc -L ./ -o mainProStatic
main.c为主程序C文件
-lxxx -l是指定要用的静态库,要将库名去掉开头lib和后缀.a
-lcalcufunc表示使用的静态库名字为libcalcufunc.a
-L是按指定路径去找静态库,默认是从/usr/lib中找
./表示在当前路径下寻找静态库
-o 指定生成的可执行文件的名字
mainProStatic为可执行文件名
动态库:(与静态库链接方式相同)
gcc main.c -lxxx -L ./ -o xxx
例:gcc mian.c -lcalc -L ./ -o mainProDy
-lxxx -l是指定要用的动态库,要将库名去掉开头lib和后缀.so
-lcalc 表示使用动态库名字为libcalc.so
5.运行可执行文件
静态库:
./xxx(直接运行可执行文件即可,原因链接时已拷贝完整的库代码)
动态库:
./xxx该方式会报错显示无库文件,需要修改一下环境变量LD_LIBRARY_PATH,在LD_LIBRARY_PATH所指定的路径下寻找库文件
编写一个shell脚本(vi xxx.sh),内容如下
export LD_LIBRARY_PATH="/home/pi/TestLib" ---(指定路径)
./xxx ---(可执行文件)
给shell增加可执行权限(chmod +x xxx.sh)
./xxx.sh