首先建立乙個名為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程式和超過半數的自由軟體使用此許可證。此許可...