Linux编译静态库和动态库

创建静态库。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

猜你喜欢

转载自blog.csdn.net/qq_31094099/article/details/88993100