前言:
我的工作最近需要用到linux下构建多目录下Makefile产生a静态库样例的知识,我将最新的学习心得,做一个记录分享,以便以后需要使用时可以做参考。
关键词:
#linux gcc Makefile 多文件目录静态链接库lib*.a
内容:
1. 首先,理解概念:
1) 静态库(staticlibraray)(libxxx.a):将函数库的链接是放在编译时期(compiletime)完成。所有相关的对象文件(object file*.o)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库不先关,因为所有需要的函数已经在产出可执行文件过程加入到可执行文件中。
2)动态库(dynamic link library)(libxxx.so):
将库函数的链接载入时间推迟到程序执行文件的时间加入,就是动态链接库。
2. 具体的Makefile内容,具体的内容如下:
#申明变量MAKEROOT,同时获取当前的系统路径。
exportMAKEROOT := $(shell pwd)
#申明变量,常用的变量做定义
CC = gcc
OBJ =main.o print_main.o
SRC_MAIN= $(MAKEROOT)/src/main.c $(MAKEROOT)/include/print_main.h
SRC_PRINT_MAIN= $(MAKEROOT)/src/print_main.c $(MAKEROOT)/include/print_main.h
OUT_OBJ_PATH= $(MAKEROOT)/obj
#指定当前的所有*.h的文件到include目录下去找寻。
vpath %.csrc
vpath %.hinclude
#-I指定多个目录为搜索文件的路径。
INCLUDE_DIR:= -I$(MAKEROOT)/include \
-I$(MAKEROOT)/src\
-I$(MAKEROOT)/obj\
-I$(MAKEROOT)/bin\
-I$(MAKEROOT)/lib
#定义变量保存当前的路径。
CFLAGS :=$(INCLUDE_DIR)
#lib a
#a库的源文件。
SRC_LIB_FILE+= $(MAKEROOT)/src/print_main.c
#a库参数。
SO_LIB_CFLAGS+= -rsv
#输出的a库文件名称。
OUT_A_Lib:= $(MAKEROOT)/lib/libprint_main.a
CC_A = ar
#-L afterpath libso.
#-lprint_mainthe file is cancle the lib and *.a.
#-L紧紧跟当前库的目录,当前目录直接-L.
#-lprint_main去掉了libxxx.a部分。
RUN_CFLAGS+= -L$(MAKEROOT)/lib/ -lprint_main
#可执行文件的输出名称。
OUT_RUN:= -o run
#主程序依赖的文件。
SRC_MAIN= $(MAKEROOT)/src/main.c $(MAKEROOT)/include/print_main.h
#库程序依赖的文件。
SRC_PRINT_MAIN=$(MAKEROOT)/src/print_main.c$(MAKEROOT)/include/print_main.h
#库a输出的路径。
OUT_OBJ_PATH= $(MAKEROOT)/obj
#依赖关系:可执行文件main,依赖于本身的主程序和库.a文件。
#命令部分:编译C语言+文件路径参数+源文件位置+a+输出可执行
main :main.o libprint_main.a
$(CC) $(CFLAGS) $(MAKEROOT)/src/main.c$(RUN_CFLAGS) -o main
main.o :$(SRC_MAIN)
$(CC) $(CFLAGS) -c $(MAKEROOT)/src/main.c -o$(OUT_OBJ_PATH)/$@
libprint_main.a: print_main.o
$(CC_A) $(SO_LIB_CFLAGS) $(OUT_A_Lib)$(MAKEROOT)/obj/print_main.o
print_main.o: $(SRC_PRINT_MAIN)
$(CC) $(CFLAGS) -c $(MAKEROOT)/src/print_main.c-o $(OUT_OBJ_PATH)/$@
.PHONY :clean
clean:
rm -rf main
rm -rf $(MAKEROOT)/obj/*.*
rm -rf $(MAKEROOT)/lib/*.*
执行前的目录内容:
make执行后的输出内容:
Make执行后的目录输出文件:
运行文件的效果:
注意以下的内容:
linux下man ar一下就可以得到参数,这里说明几个常用的
d:从库中删除成员文件。
r:在库中加入成员文件,若存在,则替换。
c:创建一个库。
s:无论ar命令是否修改了库内容,都强制重新生成库符号表。
其他的命令用时再man。
附上源码(位置:空间中下载即可):
直接将其copy到linux目录下直接运行即可。