用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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM