Makefile工程管理初探

2021-08-19 20:25:35 字數 2852 閱讀 7472

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 指令碼一樣,其中也...