用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
",my_plus(8,8));    
    printf("[my_minus ] = %d
",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

 

原文地址:https://www.cnblogs.com/thoughtInShare/p/14088582.html