用makefile编译生成.a文件(linux静态库),并编译进可执行文件中
本文转载自 https://blog.csdn.net/aflyeaglenku/article/details/47779941
文件列表:
代码文件
/*以下内容保存为“minus.c”*/
#include "my_math.h" int my_minus(int x, int y) { return x - y; }
/*以下内容保存为“minus.c”*/
#include "my_math.h" int my_plus(int x, int y) { return x+y; }
/*以下内容保存为“lib_test.c”*/
#include "my_math.h" int main() { printf("[my_plus ] = %d\n",my_plus(8,8)); printf("[my_minus ] = %d\n",my_minus(8,8)); }
makefile文件
/*以下内容保存为“lib.mak”*/
SHELL = /bin/sh CC = gcc AR = ar CFLAG = -O2 -W -Wall INCLUDE_PATH = -I. LIB_TARGET = ./libmath.a PLUS_OBJ = plus.o PLUS_SRC = ./plus.c MIN_OBJ = minus.o MIN_SRC = ./minus.c all : $(LIB_TARGET) $(PLUS_OBJ): $(PLUS_SRC) $(CC) $(CFLAG) $(INCLUDE_PATH) -c $(PLUS_SRC) $(MIN_OBJ): $(MIN_SRC) $(CC) $(CFLAG) $(INCLUDE_PATH) -c $(MIN_SRC) $(LIB_TARGET) : $(PLUS_OBJ) $(MIN_OBJ) $(AR) cq $@ $^ rm -f $(PLUS_OBJ) rm -f $(MIN_OBJ) clean: rm -f $(PLUS_OBJ) rm -f $(LIB_TARGET)
notes:
$@ --代表目标文件(target)
$^ --代表所有的依赖文件(components)
$< --代表第一个依赖文件(components中最左边的那个)。
$? --代表当前目标所依赖的文件列表中比当前目标文件还要新的文件。
$* --不包括后缀名的当前依赖文件的名字
/*以下内容保存为“app.mak”*/
SHELL = /bin/sh CC = gcc INCLUDE_PATH = -I. TEST_TARGET = ./test TEST_SRC = ./lib_test.c LDFLAGS := ./libmath.a all : $(CC) -g $(TEST_SRC) $(LDFLAGS) -o $(TEST_TARGET) $(INCLUDE_PATH) clean: rm -f $(TEST_TARGET)
notes:
-g 可执行程序包含调试信息
-o 指定输出文件名
-c 只编译不链接
编译生成静态库文件
make -f lib.mak
编译生成可执行文件
make -f app.mak