Makefile (3) 基本語法和使用


make是用來管理一個工程項目的工具 .

Makefile就是這個項目文件 .

1.Makefile 是由若干條規則組成的,每個規則的語法如下所示 :

 #規則  targets: prerequisites command 
 #舉例 main.c func1.c  hello: main.o func1.o gcc main.o func1.o -o hello  main.o: main.c gcc -c main.c func1.o: func1.c gcc -c func1.c

 

2.makefile的時間戳

  對於已經編譯過一次的工程,如果沒有對源文件進行修改,目標文件是不會重復編譯的,這樣編譯效率比較高.

  也就是說,如果目標文件和依賴文件的時間戳是一樣的,就不會重新編譯,

  如果目標文件的時間戳比依賴文件的時間戳舊,就會重新編譯.

 

3.偽目標

  對於工程的清理, 需要寫一個clean功能,這種類似的功能, 不需要依賴文件,這種命令 稱作 偽目標.

 #偽目標  # .PHONY: xxx .PHONY: clean  clean: rm -rf *.o hello .PHONY: install
  install: cp hello /usr/bin  .PHONY: uninstall  uninstall: rm /usr/bin/hello

 

 

4.makefile 的變量

  1.用戶自定義變量 2.預定義變量 3.自動變量
 #用戶自定義變量 -- OBJ = main.o func1.o ...  hello : $(OBJ) gcc $(OBJ) -o hello #預定義變量 AR --> ar CC --> 編譯器 ARFLAGS --> 庫編譯選項 CFLAGS --> C編譯器選項 #舉例 CFLAGS = -g -c gcc $(CFLAGS) func.c  #自動變量 $* --> 不包含擴展名的目標文件名稱 #main.o : main.c   $* 表示main.o 中的main $< --> 表示第一個依賴文件的名稱 $? --> 所有時間戳比目標文件晚的依賴文件 $@ --> 目標文件的完成名稱 $^ --> 所有不重復的依賴文件 # hello : main.o func1.o  # $(CC) $^ -o $@
 

5.makefile 條件判斷

 #條件判斷不能用tab 打頭  hello: main.o func1.o ifeq ($(CC),gcc) gcc $^ -o $@ else $(CC) $^ -o $@ endif

 

6.Makefile的嵌套和引用

  一個工程是由一層一層Makefile的嵌套組成的 .每個Makefile文件負責管理不同的部分,然后通過嵌套和引用,來管理整個工程的源碼 .

 #包含 include proc/makefile ​ #嵌套 subsystem: $(MAKE) -C subdir

 

7.makefile 管理命令

-C dir 執行指定文件夾下面的makefile
-f file 讀入當前文件夾下的file 為 Makefile
-i 忽略所有命令執行的錯誤
-I dir 指定被包含(include)的Makefile 的路徑
  -C 用於迭代, /-
   |-Makefile |-srcA |  |-xx.c |  |-Makefile |
   |-srcB |-xx.c |-Makefile  #在根目錄下的Makefile $(MAKE) -C srcA $(MAKE) -C srcB

 

8.用偽目標生成多個文件

 .PHONY: all  all: tar1 tar2 tar3  tar1: tar1.o $(CC) $^ -o $@ ​  tar2: tar2.o $(CC) $^ -o $@  tar3: tar3.o $(CC) $^ -o $@

 

 

 

 


免責聲明!

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



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