前言
在linux下做项目,难免会有对库的封装,需要把自己编写的程序编译成静动态库给其他人提供接口,这时候最重要的就是Makefile的编写。
一、动态库Makefile的编写和使用
1、动态链接
连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序,也就是你在执行应用程序的时候一定要把你编译后的.so配置到你执行程序环境下,直接拷贝到/lib/目录下也是可以的。
2、动态库Makefile的编写
CC=gcc//gcc 编译器,如果要在ARM上应用就需要交叉编译器 CCFLAGS= -g -Wall SRC:= $(wildcard *.c ) //当前文件夹下所有.c文件,如果还有其他.c文件,也放到括号里面 OBJS:=$(patsubst %.c,%.o,$(SRC)) //.c文件链接成的.o文件 INCLDPATH=-I. //所需要的头文件目录 LIB_OBJECT = ./libyuvtorgb.so//动态库所在目录和名字 .PHONY:all all:$(LIB_OBJECT) $(LIB_OBJECT):$(OBJS) $(CC) -shared -o $(LIB_OBJECT) $(OBJS) %.o : %.c $(CC) -fPIC -c $(CCFLAGS) $(INCLDPATH) -o $@ $< clean: rm -rf $(LIB_OBJECT) $(OBJS)
3、动态库的使用
1)库函数、头文件均在当前目录下
# gcc -o my_test mytest.c libtestlib.so
2)库函数、头文件假设在/opt目录
# gcc - - o mytest mytest.c -L/opt -lltestlib -I/opt\
二、静态库Makefile的编写和使用
1、静态链接
由链接器在链接时将库的内容加入到可执行程序中,运行执行程序的时候直接就可以运行,但链接出的应用程序比较大。
2、静态库Makefile的编写
CC=gcc //gcc 编译器,如果要在ARM上应用就需要交叉编译器。 CCFLAGS= -g -Wall SRC:= $(wildcard *.c ) //当前文件夹下所有.c文件,如果还有其他.c文件,也放到括号里面 OBJS:=$(patsubst %.c,%.o,$(SRC)) //.c文件链接成的.o文件 INCLDPATH=-I. //所需要的头文件目录 AR:=ar rc //RC链接成静态库 LIB_OBJECT = ./libyuvtorgb.a //静态库所在目录和名字 .PHONY:all all:$(LIB_OBJECT) $(LIB_OBJECT):$(OBJS) $(AR) $(LIB_OBJECT) $(OBJS) %.o : %.c $(CC) -c $(CCFLAGS) $(INCLDPATH) -o $@ $< clean: rm -rf $(LIB_OBJECT) $(OBJS)
3、动态库的使用
1)库函数、头文件均在当前目录下
# gcc -o my_test mytest.c libtestlib.a
2)库函数、头文件假设在/opt目录
# gcc - - o mytest mytest.c -L/opt -lltestlib -I/opt
注意:当静态库与动态库重名时,系统会优先连接动态库,或者我们可以加入-static指定使用静态库