<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    多目錄下多文件 makefile編寫

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    前面已經分享了單目錄項下多文件的makefile的編寫,現在來看看多目錄下多文件makefile的編寫;

            在做項目時,一般文件都會分幾個目錄來存放;基本的是  include/  bin/ src/ obj/ lib/ tools/,這幾個文件;我先說下我的文件存放目錄,用ls -R可以查看到所有文件:./include/common.h    ./src/main.c    ./src/printStatus.c  就三個文件,其中*.c 文件都依賴于 *.h文件;

            同樣的先上第一版makefile:

     

    [cpp] view plaincopy  
    1. CC=gcc  
    2. objects=obj/main.o obj/printStatus.o  
    3.   
    4. bin/main:$(objects)  
    5.    $(CC) -o bin/main $(objects)  
    6.   
    7. obj/main.o:src/main.c include/common.h  
    8.    $(CC) -o obj/main.o -c src/main.c -Iinclude  
    9.   
    10. obj/printStatus.o:src/printStatus.c include/common.h  
    11.    $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude  
    12.   
    13. clean:  
    14.    rm -rf $(objects) bin/main  

            上面的makefile就是gcc命令的拼湊起來的,下面來分享下比較通用的多目錄下的makefile;

     

            在看多目錄的makefile時,先來理解下幾個函數和變量;

    函數:

            wildcard 這是擴展通配符函數,功能是展開成一列所有符合由其參數描述的文 件名,文件間以空格間隔;比如:羅列出src下的所有.c文件:$(wildcard ${SRC}/*.c)

            patsubst 這是匹配替換函數, patsubst ( 需要匹配的文件樣式,匹配替換成什么文件,需要匹配的源文件)函數。比如:用src下的*.c替換成對應的 *.o文件存放到obj中:$(patsubst  %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))

            notdir 這是去除路徑函數,在上面patsubst函數中已經使用過,去除SOURCE中文件的所有目錄,只留下文件名;

     

    變量:

            $@:表示目標文件;一般是在規則中這么用:gcc  -o $@  $(object);

            $^:表示所有依賴文件;一般是在規則中這么用:gcc -o $@  $^  ;用所有依賴文件鏈接成目的文件;

            $<:表示第一個依賴文件;在規則中使用:gcc -o $@ -c $< ;其實這個時候就是每個依賴文件生成一個目的文件;

     

    第二版makefile

     

    [cpp] view plaincopy  
    1. #把所有的目錄做成變量,方便修改和移植   
    2. BIN = ./bin  
    3.  SRC = ./src  
    4.  INC = ./include  
    5.  OBJ = ./obj  
    6.    
    7. #提前所有源文件(即:*.c文件)和所有中間文件(即:*.o)  
    8.  SOURCE = $(wildcard ${SRC}/*.c)  
    9.  OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))  
    10.    
    11. #設置最后目標文件  
    12.  TARGET = main  
    13.  BIN_TARGET = ${BIN}/${TARGET}  
    14.    
    15.  CC = gcc   
    16.  CFLAGS = -g -Wall -I${INC}   
    17.    
    18. #用所有中間文件生成目的文件,規則中可以用 $^替換掉 ${OBJECT}  
    19.  ${BIN_TARGET}:${OBJECT}  
    20.      $(CC) -o $@ ${OBJECT}  
    21.    
    22. #生成各個中間文件  
    23.  ${OBJ}/%.o:${SRC}/%.c   
    24.      $(CC) $(CFLAGS) -o $@ -c $<  
    25.    
    26.  .PHONY:clean  
    27.  clean:  
    28.      find $(OBJ) -name *.o -exec rm -rf {} \; #這個是find命令,不懂的可以查下資料  
    29.      rm -rf $(BIN_TARGET)  

            這個makefile的好處就是通用性,里面不涉及到具體的文件名,當你往src目錄中添加新文件時,可以不需要修改makefile,所以這是個非常好的工具;

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全