makefile是一種用於工程管理的規則,乙個工程中的原始檔不計其數,如何通過一定的規範來指定哪些原始檔需要編譯,哪些原始檔需要忽略,這一點很重要,makefile提供了一種很好的工程管理的規則來實現對整個專案的編譯和配置,試想而知,當乙個工程包含幾千個原始檔和標頭檔案的時候,你僅僅通過單條的命令乙個乙個的進行編譯將是非常大的工程。
target:prerequisite
command
target正如英文的意思指的是目標,prerequisite指的是依賴,command表示的是命令(注意:command前面必須用tab鍵分隔,不然將不會成功),target:prerequisite指定了兩者的關係,說明要生成這些目標需要依賴某些檔案,所有兩者是有聯絡的。
比如,在開發中,我們會有一些檔案,比如main.c、add.c、sub.c ,同時提供其對於的標頭檔案為common.h 、add.h、sub.h
其對應的檔案編寫如下:
#include
#include "add.h"
#include "sub.h"
void main()
#include "sub.h"
int sub(int x, int y)
#ifndef _add_h_
#define _add_h_
#include
int add(int x, int y);
#endif /*_add_h_*/
#ifndef _sub_h_
#define _sub_h_
#include
int sub(int x, int y);
#endif /*_sub_h_*/
生成上述這些檔案的target檔案,可以通過
方式一:直接生成目標檔案
gcc -o target main.c add.c sub.c 最終生成elf檔案 x86
方式二:有時候我們還需要產生中間的.o檔案以便我們進行分析和鏈結
在linux下面我們知道,要編譯這些檔案我們可以分別將這些檔案先只編譯不鏈結,生成各自的.o檔案
通過gcc -c ***.c
arm-linux-gcc -c *.c (這裡的*.c表示任意的.c檔案,分開寫sub.c main.c add.c)
gcc -o target *.o (這裡*.表示所有的.o檔案 分開寫 sub.o main.o add.o)
方式三:同時也可以建立乙個指令碼檔案來實現上述功能
#vi genbash
編寫下面的內容
#!/bin/bash
arm-linux-gcc -c *.c
gcc -o target *.o
儲存後,
通過終端執行
#bash genbash 來生成**
那麼運用makefile會有什麼好處呢?
下面分三種情況來說明makefile的優勢
#vi makefile
下面**一下下面三個makefile程式,實現的功能是一樣的,你會選擇哪個?
target:main.c sub.c add.c
gcc -o target main.c sub.c add.c
clean:
rm -f target
target:main.o sub.o add.o
gcc -o target main.o sub.o add.o
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
clean:
rm -f *.o target
cc := gcc
target:main.o sub.o add.o
$(cc) -o $@ $^
%.o:%.c
$(cc) -c $^
clean:
rm -f *.o target cc := gcc
objs := main.o sub.o add.o
target:$(objs)
$(cc) -o $@ $^
%.o:%.c
$(cc) -c $^
clean:
rm -f *.o target
編寫makefile,通過終端輸出make即可實現對所有檔案的編譯工作,是不是很強大
上面引入的偽目標和
偽目標的格式
.phony : name
name :
command
可見偽目標和makefile的規則相似,通過
.phony宣告它是偽目標,不過現在的編譯器做的已經不錯了,現在也可以不要加入
make clean (清除工作)
make write2sd ( 迅速將檔案寫到sd卡)
偽目標和makefile的規則不要的是它不需要依賴關係,這是它倆的區別所在
在第三個makefile和第四個makefile中引入的一些變數,其概念如下:
# $@: 目標集合
# $<: 依賴中的第乙個
# $^: 所有依賴檔案集合
# %.o: 所有的.o
# %.c:所有的.c檔案
參考: 陳皓 跟我一起寫makefile
Makefile工程管理
1 makefile用途 make的工作主要依賴於乙個叫makefile的檔案。makefile檔案描述了整個程式的編譯,鏈結等規則。其中包括 工程中的哪些原始檔需要編譯以及如何編譯,如何最後產生我們想要的可執行檔案。2 makefile中最重要的組成部分是規則 規則 用於說明如何生成目標檔案,規則...
makefile工程管理
當工程量少時,可以採用gcc檔案單個編譯。像linux kernel 1萬多個時採用make管理。linux程式設計師必須學會使用gnu make來構建和管理自己的軟體工程。make在執行時,需要乙個命名為makefile的檔案。makefile檔案描述了整個工程的編譯 鏈結等規則。makefile...
工程管理 makefile檔案
乙個工程中的原始檔不計數,其按型別 功能 模組分別放在若干個目錄中,編譯需要花費很多時間,還有可能出錯。makefile 定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為makefile 就像乙個 shell 指令碼一樣,其中也...