动态库
动态库又名动态链接库,程序编译后,不包含动态库部分的代码,只留下相应接口,程序开始运行的时候加载动态库,动态库用于实现多个模块之间共享代码。
通过makefile,将add部分制作动态库。Linux中,动态库以lib开头,.so为后缀保存,编译和使用时其名称为中掐头去尾的部分。编译过程中,需要提供库的信息,因此需要给出库的文件地址-L给出库的文件地址。编译完成后,程序保存动态库名称和函数地址,但不包含动态库文件位置,动态库制作后,需要发布到系统制动位置,以/usr/lib/为例。编译动态库需要加-fPIC -shared,编译后将生成的.so文件复制到目标文件夹中。
libadd.so:
gcc -fPIC -shared add.c -o libadd.so
sudo cp -u libadd.so /usr/lib/
动态库可以通过程内的函数加载,也可以在编译时指定,以后者为例,编译时包含库要添加-l库名。
calc:calc.o libadd.so sub.o multi.o
gcc calc.o sub.o multi.o -ladd -o calc2
ps:动态库中的全局变量在多线程中无法共享
静态库
静态库又名静态链接库,是将部分代码提前编译,程序编译时将指定的静态库包含到程序内, 程序本身包含静态库的代码部分。
通过makefile将sub程序制作成静态库。Linux中,动态库以lib开头,.a为后缀保存,编译和使用时其名称为中掐头去尾的部分。编译过程中,需要提供库的信息,因此需要给出库的文件地址-L给出库的文件地址。需要先对源文件进行汇编操作 (使用参数 -c) 得到二进制格式的目标文件 (.o 格式),制作静态库需要用到ar工具。
libsub.a:sub.o
ar -r libsub.a sub.o
制作静态库后,无需发布,编译程序时-lsub指令包含该静态库,同时-I指定头文件地址,-L指定库文件搜索目录
calc:calc.o libadd.so libsub.a multi.o
gcc calc.o sub.o multi.o -ladd -lsub -o calc2