热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux编译静态库和动态库

创建静态库。a文件。用CC开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚本中用

创建静态库。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 = gccall: main
main: libcalc.a main.c libshow.sogcc -o main main.c -L. -lcalc -lshowlib: libcalc.a libshow.so
libcalc.a : calc.oar 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.oclean: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.cCC = aarch64-linux-gnu-gcc
AR = aarch64-linux-gnu-gcc-ar
CFLAGS = -Wall -g
LIBS = -lpthreadall: testapp
testapp: $(CBJS) libAll.a $(HOBJS)$(CC) -static -o $&#64; -c $<-L. -lAll $(LIBS)
lib: libAll.a
libAll.a : $(LIBOBJS)$(AR) crs libAll.a $^main.o:main.c $(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Common.o:Common.c Common.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
FuncMenu.o:FuncMenu.c FuncMenu.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Image.o:Image.c Image.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
LED.o:LED.c LED.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Linux_GPIO.o:Linux_GPIO.c Linux_GPIO.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Linux_I2C.o:Linux_I2C.c Linux_I2C.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Linux_SPI.o:Linux_SPI.c Linux_SPI.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
mem_map.o:mem_map.c mem_map.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Panel.o:Panel.c Panel.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Utility.o:Utility.c Utility.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
VFD.o:VFD.c VFD.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
clean:rm -rf *.o *.a main

单独编译静态库文件

LIBOBJS &#61; Common.o Image.o LED.o Linux_GPIO.o Linux_I2C.o Linux_SPI.o mem_map.o Panel.o Utility.o VFD.oCC &#61; aarch64-linux-gnu-gcc
AR &#61; aarch64-linux-gnu-gcc-ar
CFLAGS &#61; -Wall -g
LIBS &#61; -lpthreadall: libAll.a
libAll.a : $(LIBOBJS)$(AR) crs libAll.a $^Common.o:Common.c Common.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Image.o:Image.c Image.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
LED.o:LED.c LED.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Linux_GPIO.o:Linux_GPIO.c Linux_GPIO.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Linux_I2C.o:Linux_I2C.c Linux_I2C.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Linux_SPI.o:Linux_SPI.c Linux_SPI.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
mem_map.o:mem_map.c mem_map.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Panel.o:Panel.c Panel.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Utility.o:Utility.c Utility.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
VFD.o:VFD.c VFD.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
clean:rm -rf *.o *.a main

log

 

与编译好的库文件 一起编译TestAPP

CBJS &#61; main.c Common.c FuncMenu.c
HOBJS &#61; 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.hCC &#61; aarch64-linux-gnu-gcc
AR &#61; aarch64-linux-gnu-gcc-ar
CFLAGS &#61; -Wall -g
LIBS &#61; -lpthreadall: testapp
testapp: $(CBJS) libAll.a $(HOBJS)$(CC) -static -o $&#64; -c $<-L. -lAll $(LIBS)main.o:main.c $(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
Common.o:Common.c Common.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)
FuncMenu.o:FuncMenu.c FuncMenu.h$(CC) $(CFLAGS) -c $<-o $&#64; $(LIBS)clean:rm -rf *.o testapp

log

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
author-avatar
用户d4k2wd8en1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有