一、
静态库(后缀.a):程序执行前(编译)就加入到目标程序中去了
优点:运行速度快,发布程序无需提供静态库,因为已经在编译到目标程序中,运行的时候可以直接运行,移植方便
缺点:太占内存,多次复用就会有多份拷贝
动态库和共享函数库是一个东西:(Linux上叫做共享函数库,文件后缀是.so,windows叫做动态函数库,后缀是.dill)在执行时动态加载(临时)有目标程序去调用
缺点:运行速度慢
优点:多个程序可共用,节省内存
二、
1.静态库的制作:格式:xxxxx.a
gcc xxxx.c -c //生成.o文件
ar rcs libxxx.a xxxx.o//生成.a文件(静态库文件)
2.静态库的使用(砍头去尾:libaddfunc.a -----> -laddfunc,动态链接的方式使用)
gcc add_main.c -laddfunc -L ./ -o staticadd
-L ./的意思是优先在当前路径去寻找,如果只是-laddfunc,运行时会优先去/usr/local/lib路径下寻找,编译不加-L ./ 会报错
-o staticadd 是生成可编译文件,就不用./a.out了 ./staticadd就可以执行了
3.动态库的制作:libxxx.so
命名规则:libname.so.x.y.z
lib:表示共享库(动态库)
name:共享库名字
.so:固定后缀
.x:主版本号
.y:次版本号
.z:发行版本号
gcc -shared -fpic xxx.c -o libxxx.so
-shared:生成动态库
-fpic:是一种标准,用作编译阶段,生成目标文件时使用,生成位置无关的代码
但是编译动态库会出现这个问题,动态库只能去/usr/lib路径下寻找
所以使用动态库时必须指定路径:可以在环境变量中加一行这个:
export LD_LIBRARY_PATH="/home/pi",但是有一个问题是环境变量只能在当前页面使用,克隆一个会话时不能使用的 /home/pi是当前目录
所以我们可以写一个shell脚本,把两个命令连起来
再加上可运行权限
运行./start.sh即可