动态库

动态库又名动态链接库,程序编译后,不包含动态库部分的代码,只留下相应接口,程序开始运行的时候加载动态库,动态库用于实现多个模块之间共享代码。
通过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

android makefile 动态库链接 makefile加载动态库_makefile


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

android makefile 动态库链接 makefile加载动态库_文件地址_02