什麼是makefile檔案以及它是怎麼工作的?

2021-10-24 18:58:53 字數 3189 閱讀 2623

首先建立乙個名為makefile的檔案,內容:

say_hello:

echo

"hello world"

然後在終端執行

$ make

echo

"hello world"

hello world

在這個栗子裡,say_hello像是乙個函式名,我們把它叫做目標target,下面的那句命令叫做recipe(方法、菜譜)

更一般的,makefile的形式為:

target: prerequisites

recipe

多加幾個target:

say_hello:

@echo "hello world"

generate:

@echo "creating empty text files..."

touch file-.txt

clean:

@echo "cleaning up..."

rm *.txt

但真正執行的只有say_hello,因為預設第乙個target是預設target,可以增加一條語句.default_goal := generate,就可以執行generate這條。

如果想要執行多條target,要使用all,比如下面這個程式,可以同時執行sayhello和generate

all: say_hello generate

say_hello:

@echo "hello world"

generate:

@echo "creating empty text files..."

touch file-.txt

clean:

@echo "cleaning up..."

rm *.txt

我們還要宣告,這些target並不是檔名,用.phony語句:

.phony: all say_hello generate clean

all: say_hello generate

say_hello:

@echo "hello world"

generate:

@echo "creating empty text files..."

touch file-.txt

clean:

@echo "cleaning up..."

rm *.txt

執行結果為:

$ make

hello world

creating empty text files...

touch file-.txt

看下面這個較為複雜**,我們來一句一句看它的功能:

看不懂沒關係,因為這裡有大量的變數呼叫,很多地方被簡化,文章後面有這個**的擴充套件版

#注釋

# usage:

# make # compile all binary

# make clean # remove all binaries and objects

#defines phony targets all and clean.

.phony = all clean

cc = gcc # compiler to use

linkerflag = -lm

srcs :=

$(wildcard *.c)

#$(wildcard pattern) 是一種檔名函式,上面這句話的意思是所有擴充套件名為.c的檔案都會被存進變數srcs中。

bins :=

$(srcs:%.c=%)

#這句話被叫做「引用替換substitution reference」,上面這句話的意思是如果srcs有'foo.c bar.c'這樣命名的檔案, bins裡會替換成'foo bar'.

all: $

%: %.o

@echo "checking.."

$$ $< -o $@

#呼叫$裡面的所有值

%.o: %.c

@echo "creating object.."

$ -c $<

#編譯clean:

@echo "cleaning up..."

rm -rvf *.o $

#最後,在這個target裡刪除所有的二進位制檔案和編譯後的專案

%: %.o

@echo "checking.."

$$ $< -o $@

等價於下面這個**,容易理解一點:

foo: foo.o

@echo "checking.."

gcc -lm foo.o -o foo

# usage:

# make # compile all binary

# make clean # remove all binaries and objects

.phony = all clean

cc = gcc # compiler to use

linkerflag = -lm

srcs := foo.c

bins := foo

all: foo

foo: foo.o

@echo "checking.."

gcc -lm foo.o -o foo

foo.o: foo.c

@echo "creating object.."

gcc -c foo.c

clean:

@echo "cleaning up..."

rm -rvf foo.o foo

更多關於makefile的資料,看gun自己寫的文件:

關於gun autotools的介紹:

參考: patil

什麼是檔案?

這裡所要提及的檔案 file 是指計算機檔案。計算機檔案是以計算機硬碟為載體儲存在計算機上的資訊集合。檔案可以是文字文件 程式等等。檔案通常具有三個字母的副檔名,用於指示檔案型別 例如,檔案常常以 jpeg 格式儲存並且擴充套件名為 jpg 檔案有不同型別,在程式設計中,主要用到兩種檔案 1.程式檔...

Makefile介紹及Makefile是如何工作的

make命令執行時,需要乙個 makefile 檔案,以告訴make命令如何去編譯和鏈結程式。首先,我們用乙個示例來說明makefile的書寫規則。以便給大家乙個感性認識。這個示例 於gnu的make使用手冊,在這個示例中,我們的工程有8個c檔案,和3個頭檔案,我們要寫乙個makefile來告訴ma...

什麼是GPL, LGPL以及SPL

因為要做的東西涉及到license的問題,所以查了一下這三種license gpl 和 lgpl gnu通用公共許可證 簡稱為gpl 是由自由軟體 會發行的用於計算機軟體的許可證。最初由richard stallman為gnu計畫而撰寫。目前大多數的gnu程式和超過半數的自由軟體使用此許可證。此許可...