makefile

工程中的代碼分別存放在add/add_int.c、add/add_float.c、add/add.h、sub/sub_int.c、sub/sub_float.c、sub/sub.h、main.c中。函數

文件main.c優化

#include <stdio.h>spa

#include "add.h"            命令行

#include "sub.h"xml

int main(void)字符串

{input

       int input = 0;io

       int a = 10, b = 12;編譯

       float x= 1.23456,y = 9.87654321;變量

      

       printf("int a+b IS:%d\n",a+b);

       printf("int a-b IS:%d\n",a-b);

       printf("float x+y IS:%f\n",x+y);

       printf("float x-y IS:%f\n",x-y);

 

 

       return 0;      

}

加操做 

#ifdef __ADD_H__

#define __ADD_H__

extern int add_int(int a, int b);

extern float add_float(float a, float b);

#endif  

float add_float(float a, float b)

{

       return a+b;  

}  

int add_int(int a, int b)

{

       return a+b;  

}

減操做

#ifdef __ADD_H__

#define __ADD_H__

extern float sub_float(float a, float b);

extern int sub_int(int a, int b);

#endif 

float sub_float(float a, float b)

{

       return a-b;   

int sub_int(int a, int b)

{

       return a-b;   

}

命令行編譯程序:

#gcc -c add/add_int.c -o add/add_int.o      #生成add_int.o目標函數

#gcc -c add/add_float.c -o add/add_float.o   #生成add_float.o目標函數

#gcc -c sub/sub_int.c -o sub/sub_int.o       #生成sub_int.o目標函數

#gcc -c sub/sub_float.c -o sub/sub_float.o    #生成sub_float.o目標函數

#gcc -c main.c -o main.o                  #生成main.o目標函數

#gcc -o casu add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o

#連接生成cacu

多文件的makefile

#生成casu,「;」右邊爲目標

casu:add_int.o add_float.o sub_int.o sub_float.o main.o

       gcc -o casu add/add_int.o add/add_float.o \          # \爲鏈接符

                     sub/sub_int.o sub/sub_float.o main.o    

#生成add_int.o的規則,將add_int.c編譯生成目標文件add_int.o

add_int.o:add/add_int.c add/add.h

       gcc -c -o add/add_int.o add/add_int.c

#生成add_float.o的規則

add_float.o:add/add_float.c add/add.h

       gcc -c -o add/add_float.o add/add_float.c

#生成sub_int.o的規則

sub_int.o:sub/sub_int.c sub/sub.h

       gcc -c -o sub/sub_int.o sub/sub_int.c

#生成sub_float.o的規則

sub_float.o:sub/sub_float.c sub/sub.h

       gcc -c -o sub/sub_float.o sub/sub_float.c

#生成main.o的規則

main.o:main.c add/add.h sub/sub.h

       gcc -c -o main.o main.c -Iadd -Isub

      

#清理規則

clean:

       rm -f casu add/add_int.o add/add_float.o \

             sub/sub_int.o sub/sub_float.o main.o

使用自定義變量的makefile文件:

CC = gcc                                #CC定義成gcc

CFLAGES =    -Iadd -Isub -O2   #加入頭文件搜索路徑sub和add,O2爲優化#目標文件

OBJS = add/add_int.o add/add_float.o \

              sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                           #生成的可執行文件

RM = rm -f                              #刪除的命令

$(TARGET):$(OBJS)                       #TARGET目標,須要先生成OBJS目標

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)   #生成可執行文件

$(OBJS):%.o:%.c          #將OBJS中全部擴展名爲.o的文件替換成擴展名爲.c的文件

       $(CC) -c $(CFLAGES) $< -o $@        #採用CFLAGS指定的選項編譯生成目標文件

clean:                               #清理

       -$(RM) $(TARGET) $(OBJS)           #刪除全部的目標文件和可執行文件

使用預約義變量的makefile文件:

CFLAGES =    -Iadd -Isub -O2               #編譯選項

OBJS = add/add_int.o add/add_float.o \

               sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                          #生成的可執行文件

$(TARGET):$(OBJS)                       #TARGET目標,須要先生成OBJS目標

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)  #生成可執行文件

$(OBJS):%.o:%.c          #將OBJS中全部擴展名爲.o的文件替換成擴展名爲.c的文件

       $(CC) -c $(CFLAGES) $< -o $@        #採用CFLAGS指定的選項編譯生成目標文件

clean:                               #清理

       -$(RM) $(TARGET) $(OBJS)           #刪除全部的目標文件和可執行文件

使用自動變量的makefile文件:

CFLAGES =    -Iadd -Isub -O2               #編譯選項

OBJS = add/add_int.o add/add_float.o \

               sub/sub_int.o sub/sub_float.o main.o

TARGET = casu                           #生成的可執行文件

$(TARGET):$(OBJS)                       #TARGET目標,須要先生成OBJS目標

       $(CC) -o  $@  $^ $(CFLAGES)          #生成可執行文件

$(OBJS):%.o:%.c          #將OBJS中全部擴展名爲.o的文件替換成擴展名爲.c的文件

       $(CC) -c $<  $(CFLAGES) -o $@      #採用CFLAGS指定的選項編譯生成目標文件

clean:                               #清理

       -$(RM) $(TARGET) $(OBJS)           #刪除全部的目標文件和可執行文件

使用搜索路徑的makefile文件:

CFLAGES =    -Iadd -Isub -O2  

OBJSDIR = .objs

VPATH = add:sub:.        

OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = casu                          

$(TARGET):$(OBJSDIR) $(OBJS)      #先檢測OBJSDIR和OBJS依賴項是否存在                 

       $(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGES)

 #將OBJSDIR目錄中全部的.o文件連接成casu          

$(OBJS):%.o:%.c         

       $(CC) -c  $< $(CFLAGES) -o $(OBJSDIR)/$@ #生成目標文件,存放在OBJSDIR目錄中

$(OBJSDIR):

       mkdir -p ./$@            #創建目錄,-p選項能夠忽略父目錄不存在的錯誤

clean:                                

       -$(RM) $(TARGET)        #刪除casu

       -$(RM) $(OBJSDIR)/*.o    #刪除OBJSDIR目錄下的全部.o文件

使用自動推導規則的makefile

CFLAGS = -Iadd -Isub -O2         # 用戶自定義變量

VPATH=add:sub                # 搜索路徑

OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o

TARGET = cacu

$(TARGET):$(OBJS)             #OBJS依賴項的規則自動生成

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)    #連接文件

clean:

       -$(RM) $(TARGET)        #「-」表示當前操做失敗時不報錯,命令繼續執行

       -$(RM) $(OBJS)

使用函數的makefile文件:

CC = gcc                               #CC定義成gcc

VPATH =add:sub

CFLAGES =    -Iadd -Isub -O2     #加入頭文件搜索路徑sub和add,O2爲優化#目標文件

TARGET = casu                         #生成的可執行文件

DIRS = sub add .                     #DIRS字符串的值爲目錄add、sub和當前目錄

FILES = $(foreach dir, $(DIRS),$(wildcard $(dir)/*.c))  #查找所用目錄下的.c文件

OBJS = $(patsubst %.c,%.o,$(FILES))          #將.c替換成.o

$(TARGET):$(OBJS)                        #TARGET目標,須要先生成OBJS目標

       $(CC) -o $(TARGET) $(OBJS) $(CFLAGES)   #生成可執行文件

clean:                                  #清理

       -$(RM) $(TARGET) $(OBJS)              #刪除全部的目標文件和可執行文件

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息