创建静态库。a文件。用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到。关于Linux下的库文件、静态库、动态库以及怎样创建和使用等相关知识,参见本文后面的相关资料【3】《关于Linux静态库和动态库的分析》。
常用参数
格式:ar rcs libxxx.a xx1.o xx2.o
参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。【1】
参数c:创建一个库。不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果。a文件缺少索引,可以使用ranlib命令添加)
Makefile格式知识点
①Makefile中的=区别:
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
②修饰符
-Wall 是打开警告开关,-O代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化。
-g是生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息。
③-l -L -lworld
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例:
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
上面这句表示在编译hello.c时:
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,
寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include
-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,
寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib
-lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)
编译动态库和静态库的示例Makefile如下
CC = gcc
all: main
main: libcalc.a main.c libshow.so
gcc -o main main.c -L. -lcalc -lshow
lib: libcalc.a libshow.so
libcalc.a : calc.o
ar crs libcalc.a calc.o
calc.o : calc.c
$(CC) -c calc.c -o calc.o
libshow.so: show.o
$(CC) -shared -o libshow.so show.o
show.o: show.c
$(CC) -fPIC -Wall -c show.c -o show.o
clean:
rm -rf *.o *.so *.a main
静态库和测试APP一起编译的Makefile文件
LIBOBJS = Image.o LED.o Linux_GPIO.o Linux_I2C.o Linux_SPI.o mem_map.o Panel.o Utility.o VFD.o
HOBJS = Common.h FuncMenu.h Image.h LED.h Linux_GPIO.h Linux_I2C.h Linux_SPI.h mem_map.h Panel.h Utility.h VFD.h
CBJS = main.c Common.c FuncMenu.c
CC = aarch64-linux-gnu-gcc
AR = aarch64-linux-gnu-gcc-ar
CFLAGS = -Wall -g
LIBS = -lpthread
all: testapp
testapp: $(CBJS) libAll.a $(HOBJS)
$(CC) -static -o $@ -c $< -L. -lAll $(LIBS)
lib: libAll.a
libAll.a : $(LIBOBJS)
$(AR) crs libAll.a $^
main.o:main.c
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Common.o:Common.c Common.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
FuncMenu.o:FuncMenu.c FuncMenu.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Image.o:Image.c Image.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
LED.o:LED.c LED.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Linux_GPIO.o:Linux_GPIO.c Linux_GPIO.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Linux_I2C.o:Linux_I2C.c Linux_I2C.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Linux_SPI.o:Linux_SPI.c Linux_SPI.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
mem_map.o:mem_map.c mem_map.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Panel.o:Panel.c Panel.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Utility.o:Utility.c Utility.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
VFD.o:VFD.c VFD.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
clean:
rm -rf *.o *.a main
单独编译静态库文件
LIBOBJS = Common.o Image.o LED.o Linux_GPIO.o Linux_I2C.o Linux_SPI.o mem_map.o Panel.o Utility.o VFD.o
CC = aarch64-linux-gnu-gcc
AR = aarch64-linux-gnu-gcc-ar
CFLAGS = -Wall -g
LIBS = -lpthread
all: libAll.a
libAll.a : $(LIBOBJS)
$(AR) crs libAll.a $^
Common.o:Common.c Common.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Image.o:Image.c Image.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
LED.o:LED.c LED.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Linux_GPIO.o:Linux_GPIO.c Linux_GPIO.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Linux_I2C.o:Linux_I2C.c Linux_I2C.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Linux_SPI.o:Linux_SPI.c Linux_SPI.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
mem_map.o:mem_map.c mem_map.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Panel.o:Panel.c Panel.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Utility.o:Utility.c Utility.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
VFD.o:VFD.c VFD.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
clean:
rm -rf *.o *.a main
log
与编译好的库文件 一起编译TestAPP
CBJS = main.c Common.c FuncMenu.c
HOBJS = Common.h FuncMenu.h Image.h LED.h Linux_GPIO.h Linux_I2C.h Linux_SPI.h mem_map.h Panel.h Utility.h VFD.h
CC = aarch64-linux-gnu-gcc
AR = aarch64-linux-gnu-gcc-ar
CFLAGS = -Wall -g
LIBS = -lpthread
all: testapp
testapp: $(CBJS) libAll.a $(HOBJS)
$(CC) -static -o $@ -c $< -L. -lAll $(LIBS)
main.o:main.c
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
Common.o:Common.c Common.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
FuncMenu.o:FuncMenu.c FuncMenu.h
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
clean:
rm -rf *.o testapp
log