makefile入門

典型的makefile規(guī)則如下,參考howto_makefiles

  • target 通常是程序所生成的文件的名字,類型如可執(zhí)行文件或目標文件(.o)
  • dependency是用來創(chuàng)建目標文件的依賴文件,target會依賴好幾個這樣的文件
  • command 是make所要執(zhí)行的命令,可能有多個,每個命令都必須以tab鍵開頭
target :dependency1 dependency2 ...
        command

#使用目標文件program.o和mylib.o生成可執(zhí)行文件program
program: program.o mylib.o
    gcc -o program program.o mylib.o

單個文件的編譯很簡單

 myprog : myprog.c 
      gcc -g -Wall -o myprog myprog.c

規(guī)則很簡單,但上面的只能針對具體的文件,不夠通用,我們可以簡單泛化,對于單個文件,只要配置TARGET 為源文件名稱即可

 # 使用參數(shù)配置編譯器, gcc for C ,  g++ for C++
  CC = gcc
  # 編譯參數(shù)設置:
  #  -g    在可執(zhí)行文件中添加調(diào)試信息
  #  -Wall 盡可能多的顯示編譯警告
  CFLAGS  = -g -Wall

  # 最終可執(zhí)行的目標文件,
  TARGET = myprog

  $(TARGET): $(TARGET).c
    $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c

但實際中開發(fā)很少是單文件編譯,下面看如何使用多個源文件編譯,其實本質(zhì)和蓋樓一樣,每一步依賴之前的產(chǎn)出,比如創(chuàng)建一個可執(zhí)行文件 count 我們需要三個目標文件countwords.o, counter.o, 和 scanner.o:

count:  countwords.o counter.o scanner.o 
    $(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o

目標文件countwords.o如果不存在,也是需要從源文件編譯生成的 ,假如是 countwords.c, scanner.h, and counter.h:

countwords.o:  countwords.c scanner.h counter.h 
    $(CC) $(CFLAGS) -c countwords.c

同理,counter.o scanner.o也是這個思路

counter.o:  counter.c counter.h 
    $(CC) $(CFLAGS) -c counter.c
 
scanner.o:  scanner.c scanner.h 
    $(CC) $(CFLAGS) -c scanner.c

合在一起就是多文件編譯生成最終可執(zhí)行文件count,這種寫法和我們手動編譯是反者的,它是從結(jié)果找條件,手動編譯的先創(chuàng)造條件最終生成結(jié)果。了解規(guī)則以后,寫起來就很容易

count:  countwords.o counter.o scanner.o 
    $(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o
countwords.o:  countwords.c scanner.h counter.h 
    $(CC) $(CFLAGS) -c countwords.c
counter.o:  counter.c counter.h 
    $(CC) $(CFLAGS) -c counter.c
scanner.o:  scanner.c scanner.h 
    $(CC) $(CFLAGS) -c scanner.c

由于makefile只能有一個目標,當TARGET有多個目標文件時,可以構(gòu)造一個沒有規(guī)則的終極目標all,并以冒號后面的文件作為依賴

all:main1 main2
main1: main1.c
   gcc main1.c -o main1
main2: main2.c
   gcc main2.c -o main2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容