一、静态库和动态库
1、静态库
静态函数库,是函数执行前(编译)就加到目标程序中去了。
优点:
(1)、运行快。
(2)、发布程序无需提供静态库,因为已经在APP中,移植方便。
缺点:
(1)、 程序大。
(2)、链接时完整地拷贝至可执行文件中,别多次使用就有多份冗余拷贝。
(3)、更新,部署,发布较为麻烦
2,、动态库
动态函数库,是程序执行时(临时)动态到目标程序中去
优点:
(1)、程序小
(2)、链接时不复制,程序运行时由系统动态加载到内存,供内存调用,系统只加载一次,多个程序可以共用,节省内存。
缺点:
(1)、运行慢
(2)、发布程序需要提供依赖的动态库。
以上部分出自:
二、静态库的制作与使用
(一)、静态库的制作
格式: libxxx.a
库名为xxx,后缀是 .a
步骤:
原材料:源代码.c 或 .cpp
(a)用.c文件生成 .o文件——例:gcc Jia.c -c
(b)xxx.o文件生成xxx.a静态库文件——例:ar rcs libtest.a Jia.o(可以打包多个 .o文件)
例子:
(二)、静态库的使用(注意需要有头文件)
步骤:
(a)编译:gcc JiaMian.c -ltest -L ./ -o aaa
说明:
主函数c文件 -l库名 -L 路径 -o 可执行文件名
-l是要指定要用的静态库
-L告诉gcc编译器从-L指定的路径去找静态库,默认从 /usr/lib 或 /usr/local/lib 路径下去找。
(b)执行:做完步骤(a)就可以执行可执行文件了
例子:
三、动态库的制作与使用
(一)、动态库的制作
格式: libxxx.so
库名为xxx,后缀是 .so
gcc -shared -fpic Jia.c -o libcalc.so
-shared——指定生产动态库
-fpic——作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
(二)、动态库的使用(注意需要有头文件)
(a)编译:gcc JiaMian.c -lcalc -L ./ -o aaa(与静态库的使用一样)
(b)执行:通常需要建一个shell脚本,在脚本中输入下面内容:
export LD_LIBRARY_PATH="/home/pi/ZCB" //在 LD_LIBRARY_PATH 所指定的路径下去找库文件(一般是自己建的动态库所在路径)
./aaa //生成的可执行文件
注意 :不能像静态库那样直接 ./aaa ,这样的话会报错。
例子:
图中语句 chmod +x start.sh 目的是给该脚本加可执行权限。