makefilelinux命令
1. linux 下的makefile 中的命令
echo 『a』 就是在終端列印a
前面加@,就只輸出一行
a
否則會輸出兩行
echo 『a』
a
2. linux 下的makefile 中的命令
Linux echo命令不能顯示文件中的內容。
功能說明:顯示文字。
語 法:echo [-ne][字元串]或 echo [--help][--version]
補充說明:echo會將輸入的字元串送往標准輸出。輸出的字元串間以空白字元隔開, 並在最後加上換行號。
參 數:-n 不要在最後自動換行
-e 若字元串中出現以下字元,則特別加以處理,而不會將它當成一般文字輸出:
\a 發出警告聲;
\b 刪除前一個字元;
\c 最後不加上換行符號;
\f 換行但游標仍舊停留在原來的位置;
\n 換行且游標移至行首;
\r 游標移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
\\ 插入\字元;
\nnn 插入nnn(八進制)所代表的ASCII字元;
--help 顯示幫助
--version 顯示版本信息
3. Linux 中makefile命令怎麼使用
makefile是一個腳本文件 譬如當你編譯一個.c時可以使用 gcc -o xxx xxx.c
但是當你要編譯一個工程 這個工程有100個.c 和.h文件時 再使用如上命令 就顯得不靠譜了
這時就可以寫個makefile 寫完後輸入make命令來進行自動編譯 至於怎麼寫 說來就話長啦
你可以到網上查一查 或者到網上下載一個模版研究研究
4. Linux平台Makefile文件的編寫基礎篇
目的:
基本掌握了 make 的用法,能在Linux系統上編程。
環境:
Linux系統,或者有一台Linux伺服器,通過終端連接。一句話:有Linux編譯環境。
准備:
准備三個文件:file1.c, file2.c, file2.h
file1.c:
#include
#include "file2.h"
int main()
{
printf("print file1$$$$$$$$$$$$ ");
File2Print();
return 0;
}
file2.h:
#ifndef FILE2_H_
#define FILE2_H_
#ifdef __cplusplus
extern "C" {
#endif
void File2Print();
#ifdef __cplusplus
}
#endif
#endif
file2.c:
#include "file2.h"
void File2Print()
{
printf("Print file2********************** ");
}
基礎:
先來個例子:
有這么個Makefile文件。(文件和Makefile在同一目錄)
=== makefile 開始 ===
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
file1.o:file1.c file2.h
gcc -c file1.c -o file1.o
file2.o:file2.c file2.h
gcc -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 結束 ===
一個 makefile 主要含有一系列的規則,如下:
A: B
(tab)
(tab)
每個命令行前都必須有tab符號。
上面的makefile文件目的就是要編譯一個helloworld的可執行文件。讓我們一句一句來解釋:
helloworld : file1.o file2.o: helloworld依賴file1.o file2.o兩個目標文件。
gcc File1.o File2.o -o helloworld: 編譯出helloworld可執行文件。-o表示你指定 的目標文件名。
file1.o : file1.c: file1.o依賴file1.c文件。
gcc -c file1.c -o file1.o: 編譯出file1.o文件。-c表示gcc 只把給它的文件編譯成目標文件, 用源碼文件的文件名命名但把其後綴由「.c」或「.cc」變成「.o」。在這句中,可以省略-o file1.o,編譯器默認生成file1.o文件,這就是-c的作用。
file2.o : file2.c file2.h
gcc -c file2.c -o file2.o
這兩句和上兩句相同。
clean:
rm -rf *.o helloworld
當用戶鍵入make clean命令時,會刪除*.o 和helloworld文件。
如果要編譯cpp文件,只要把gcc改成g++就行了。
寫好Makefile文件,在命令行中直接鍵入make命令,就會執行Makefile中的內容了。
到這步我想你能編一個Helloworld程序了。
上一層樓:使用變數
上面提到一句,如果要編譯cpp文件,只要把gcc改成g++就行了。但如果Makefile中有很多gcc,那不就很麻煩了。
第二個例子:
=== makefile 開始 ===
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -Wall -O -g
helloworld : $(OBJS)
$(CC) $(OBJS) -o helloworld
file1.o : file1.c file2.h
$(CC) $(CFLAGS) -c file1.c -o file1.o
file2.o : file2.c file2.h
$(CC) $(CFLAGS) -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 結束 ===
這里我們應用到了變數。要設定一個變數,你只要在一行的開始寫下這個變數的名字,後 面跟一個 = 號,後面跟你要設定的這個變數的值。以後你要引用 這個變數,寫一個 $ 符號,後面是圍在括弧里的變數名。
CFLAGS = -Wall -O –g,解釋一下。這是配置編譯器設置,並把它賦值給CFFLAGS變數。
-Wall: 輸出所有的警告信息。
-O: 在編譯時進行優化。
-g: 表示編譯debug版本。
這樣寫的Makefile文件比較簡單,但很容易就會發現缺點,那就是要列出所有的c文件。如果你添加一個c文件,那就需要修改Makefile文件,這在項目開發中還是比較麻煩的。
再上一層樓:使用函數
學到這里,你也許會說,這就好像編程序嗎?有變數,也有函數。其實這就是編程序,只不過用的語言不同而已。
第三個例子:
=== makefile 開始 ===
CC = gcc
XX = g++
CFLAGS = -Wall -O –g
TARGET = ./helloworld
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o [email protected]
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o [email protected]
SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
$(TARGET) : $(OBJS)
$(XX) $(OBJS) -o $(TARGET)
chmod a+x $(TARGET)
clean:
rm -rf *.o helloworld
=== makefile 結束 ===
函數1:wildcard
產生一個所有以 '.c' 結尾的文件的列表。
SOURCES = $(wildcard *.c *.cpp)表示產生一個所有以 .c,.cpp結尾的文件的列表,然後存入變數 SOURCES 里。
函數2:patsubst
匹配替換,有三個參數。第一個是一個需要匹配的式樣,第二個表示用什麼來替換它,第三個是一個需要被處理的由空格分隔的列表。
OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字元變成.o,形成一個新的文件列表,然後存入OBJS變數中。
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o [email protected]
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o [email protected]
這幾句命令表示把所有的.c,.cpp編譯成.o文件。
這里有三個比較有用的內部變數。 [email protected] 擴展成當前規則的目的文件名, lt; 擴展成依靠 列表中的第一個依靠文件,而 $^ 擴展成整個依靠的列表(除掉了裡面所有重 復的文件名)。
chmod a+x $(TARGET)表示把helloworld強制變成可執行文件。
5. 在linux下怎麼makefile
Linux系統下makefile的作用把編寫好的源文件進行編譯與鏈接,makefile的基本格式如下:
target…
:prerequisite…
(Tab鍵)command
#格式解釋
target:生成的目標文件,可以是可執行文件,也可以是中間目標文件
prerequisite:生成target所需要的文件
command:make需要的執行命令,一般是編譯與鏈接的命令,命令前面必須要有Tab鍵才能有效果
makefile的簡單例子(用的Ubuntu11.10):
gcc–chello.c:編譯command目錄下的hello.c源文件,編譯之後會生成hello.o中間文件。
rm:刪除command目錄下的hello.o與exe.out文件
./exe.out:輸出exe.out可執行文件,hello.c中寫的是HelloWorld!
make:make命令與makeexe命令執行的效果是一樣的。
6. linux上的makefile怎麼使用
一、Makefile的規則
在講述這個Makefile之前,還是先來粗略地看一看Makefile的規則。
target ... : prerequisites ...
command
.......
target也就是一個目標文件,可以是Object File,也可以是執行文件。還可以是一個標簽
(Label),對於標簽這種特性,在後續的「偽目標」章節中會有敘述。
prerequisites就是,要生成那個target所需要的文件或是目標。
command也就是make需要執行的命令。(任意的Shell命令)
這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴於prerequisi
tes中的文件,其生成規則定義在command中。
二、一個示例
正如前面所說的,如果一個工程有3個頭文件,和8個C文件,為了完成前面所述的那三
個規則,的Makefile應該是下面的這個樣子的。
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
反斜杠(\)是換行符的意思。這樣比較便於Makefile的易讀。可以把這個內容保存在
文件為「Makefile」或「makefile」的文件中,然後在該目錄下直接輸入命令「make」就
可以生成執行文件edit。如果要刪除執行文件和所有的中間目標文件,那麼,只要簡單地
執行一下「make clean」就可以了。
在這個makefile中,目標文件(target)包含:執行文件edit和中間目標文件(*.o),依
賴文件(prerequisites)就是冒號後面的那些 .c 文件和 .h文件。每一個 .o 文件都有
一組依賴文件,而這些 .o 文件又是執行文件 edit 的依賴文件。依賴關系的實質上就是
說明了目標文件是由哪些文件生成的,換言之,目標文件是哪些文件更新的。
在定義好依賴關系後,後續的那一行定義了如何生成目標文件的操作系統命令,一定要以
一個Tab鍵作為開頭。記住,make並不管命令是怎麼工作的,他只管執行所定義的命令。m
ake會比較targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期
要比targets文件的日期要新,或者target不存在的話,那麼,make就會執行後續定義的命
令。
這里要說明一點的是,clean不是一個文件,它只不過是一個動作名字,有點像C語言中的
lable一樣,其冒號後什麼也沒有,那麼,make就不會自動去找文件的依賴性,也就不會自
動執行其後所定義的命令。要執行其後的命令,就要在make命令後明顯得指出這個lable的
名字。這樣的方法非常有用,可以在一個makefile中定義不用的編譯或是和編譯無關
的命令,比如程序的打包,程序的備份,等等。
三、makefile中使用變數
在上面的例子中,先讓看看edit的規則:
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
可以看到[.o]文件的字元串被重復了兩次,如果的工程需要加入一個新的[.o]文
件,那麼需要在兩個地方加(應該是三個地方,還有一個地方在 clean中)。當然,
的makefile並不復雜,所以在兩個地方加也不累,但如果makefile變得復雜,那麼我
們就有可能會忘掉一個需要加入的地方,而導致編譯失敗。所以,為了makefile的易維護
,在makefile中可以使用變數。makefile的變數也就是一個字元串,理解成 C語言中
的宏可能會更好。
比如,聲明一個變數,叫objects, OBJECTS, objs, OBJS, obj, 或是 OBJ,反正不管
什麼啦,只要能夠表示obj文件就行了。在makefile一開始就這樣定義:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
於是,就可以很方便地在的makefile中以「$(objects)」的方式來使用這個變數
了,於是的改良版makefile就變成下面這個樣子:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
於是如果有新的 .o 文件加入,只需簡單地修改一下 objects 變數就可以了。
四、make是如何工作的
在默認的方式下,輸入make命令通過makefile編譯程序時,具體的內部機制如下:
1、make會在當前目錄下找名字叫「Makefile」或「makefile」的文件。
2、如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到「
edit」這個文件,並把這個文件作為最終的目標文件。
3、如果edit文件不存在,或是edit所依賴的後面的 .o 文件的文件修改時間要比edit這個
文件新,那麼,他就會執行後面所定義的命令來生成edit這個文件。
4、如果edit所依賴的.o文件也不存在,那麼make會在當前文件中找目標為.o文件的依賴性
,如果找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)
5、當然,你的C文件和H文件是存在的啦,於是make會生成 .o 文件,然後再用 .o 文件生
命make的終極任務,也就是執行文件edit了。
這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第
一個目標文件。在找尋的過程中,如果出現錯誤,比如最後被依賴的文件找不到,那麼ma
ke就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理
。make只管文件的依賴性,即,如果在我找了依賴關系之後,冒號後面的文件還是不在,
那麼對不起,我就不工作啦。
通過上述分析,知道,像clean這種,沒有被第一個目標文件直接或間接關聯,那麼它
後面所定義的命令將不會被自動執行,不過,可以顯示要make執行。即命令——「ma
ke clean」,以此來清除所有的目標文件,以便重編譯。
於是在編程中,如果這個工程已被編譯過了,當修改了其中一個源文件,比如fi
le.c,那麼根據的依賴性,的目標file.o會被重編譯(也就是在這個依性關系後
面所定義的命令),於是file.o的文件也是最新的啦,於是file.o的文件修改時間要比ed
it要新,所以edit也會被重新鏈接了(詳見edit目標文件後定義的命令)。
而如果改變了「command.h」,那麼,kdb.o、command.o和files.o都會被重編譯,並
且,edit會被重鏈接。
7. 如何在linux下寫makefile
Make工具最主要也是最基本的功能就是通過makefile文件來描述源程序之間的相互關系並自動維護編譯工作。而makefile 文件需要按照某種語法進行編寫,文件中需要說明如何編譯各個源文件並連接生成可執行文件,並要求定義源文件之間的依賴關系。
make命令的選項與參數
然後就完了。
8. linux中make makefiles這個命令是什麼意思
無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行項目開發還是安裝應用軟體,我們都經常要用到
make或make
install。利用make工具,我們可以將大型的開發項目分解成為多個更易於管理的模塊,對於一個包括幾百個源文件的應用程序,使用make和
makefile工具就可以簡潔明快地理順各個源文件之間紛繁復雜的相互關系。而且如此多的源文件,如果每次都要鍵入gcc命令進行編譯的話,那對程序員
來說簡直就是一場災難。而make工具則可自動完成編譯工作,並且可以只對程序員在上次編譯後修改過的部分進行編譯。因此,有效的利用make和
makefile工具可以大大提高項目開發的效率。同時掌握make和makefile之後,您也不會再面對著Linux下的應用軟體手足無措了。
但令人遺憾的是,在許多講述Linux應用的書籍上都沒有詳細介紹這個功能強大但又非常復雜的編譯工具。在這里我就向大家詳細介紹一下make及其描述文件
makefile。
Makefile文件
Make工具最主要也是最基本的功能就是通過makefile文件來描述源程序之間的相互關系並自動維護編譯工作。而makefile 文件需要按照某種語法進行編寫,文件
中
需要說明如何編譯各個源文件並連接生成可執行文件,並要求定義源文件之間的依賴關系。makefile 文件是許多編譯器--包括 Windows NT
下的編譯器--維護編譯信息的常用方法,只是在集成開發環境中,用戶通過友好的界面修改 makefile 文件而已。
在 UNIX 系統中,習慣使用 Makefile 作為 makfile 文件。如果要使用其他文件作為 makefile,則可利用類似下面的 make 命令選項指定 makefile 文件:
$ make -f Makefile.debug
例如,一個名為prog的程序由三個C源文件filea.c、fileb.c和filec.c以及庫文件LS編譯生成,這三個文件還分別包含自
己的頭文件a.h
、b.h和c.h。通常情況下,C編譯器將會輸出三個目標文件filea.o、fileb.o和filec.o。假設filea.c和fileb.c都要
聲明用到一個名為defs的文件,但filec.c不用。即在filea.c和fileb.c里都有這樣的聲明:
#include "defs"
那麼下面的文檔就描述了這些文件之間的相互聯系:
#It is a example for describing makefile
prog : filea.o fileb.o filec.o
cc filea.o fileb.o filec.o -LS -o prog
filea.o : filea.c a.h defs
cc -c filea.c
fileb.o : fileb.c b.h defs
cc -c fileb.c
filec.o : filec.c c.h
cc -c filec.c
這個描述文檔就是一個簡單的makefile文件。
從上面的例子注意到,第一個字元為 # 的行為注釋行。第一個非注釋行指定prog由三個目標文件filea.o、fileb.o和filec.o鏈接生成。第三行描述了如何從prog所依賴的文件建立可執行文件。接下來的4、6、8行分別指定三個目標文件,以及它們所依賴的.c和.h文件以及defs文件。而5、7、9行則指定了如何從目標所依賴的文
件建立目標。
當filea.c或a.h文件在編譯之後又被修改,則 make 工具可自動重新編譯filea.o,如果在前後兩次編譯之間,filea.C 和a.h 均沒有被修改,而且 test.o 還存在的話,就沒有必要重新編譯。這種依賴關系在多源文件的程序編譯中尤其重要。通過這種依賴關系的定義,make 工具可避免許多不必要的編譯工作。當然,利用 Shell
腳本也可以達到自動編譯的效果,但是,Shell 腳本將全部編譯任何源文件,包括哪些不必要重新編譯的源文件,而 make 工具則可根據目標上一次編譯的時間和目標所依賴的源文件的更新時間而自動判斷應當編譯哪個源文件。
Makefile文件作為一種描述文檔一般需要包含以下內容:
◆ 宏定義
◆ 源文件之間的相互依賴關系
◆ 可執行的命令
Makefile中允許使用簡單的宏指代源文件及其相關編譯信息,在Linux中也稱宏為變數。在引用宏時只需在變數前加$符號,但值得注意的是,如果變數名的長度超過一個字元,在引用時就必須加圓括弧()。下面都是有效的宏引用:
$(CFLAGS)
$2
$Z
$(Z)
其中最後兩個引用是完全一致的。需要注意的是一些宏的預定義變數,在Unix系統中,$*、$@、$?和$<四個特殊宏的值在執行命令的過程中會發生相應的變化,而在GNU make中則定義了更多的預定義變數。關於預定義變數的詳細內容,宏定義的使用可以使我們脫離那些冗長乏味的編譯選項,為編寫makefile文
件帶來很大的方便。
# Define a macro for the object files
OBJECTS= filea.o fileb.o filec.o
# Define a macro for the library file
LIBES= -LS
# use macros rewrite makefile
prog: $(OBJECTS)
cc $(OBJECTS) $(LIBES) -o prog
……
此時如果執行不帶參數的make命令,將連接三個目標文件和庫文件LS;但是如果在make命令後帶有新的宏定義:
make "LIBES= -LL -LS"
則命令行後面的宏定義將覆蓋makefile文件中的宏定義。若LL也是庫文件,此時make命令將連接三個目標文件以及兩個庫文件LS和LL。
在Unix系統中沒有對常量NULL作出明確的定義,因此我們要定義NULL字元串時要使用下述宏定義:
STRINGNAME=
Make命令
在make命令後不僅可以出現宏定義,還可以跟其他命令行參數,這些參數指定了需要編譯的目標文件。其標准形式為:
target1 [target2 …]:[:][dependent1 …][;commands][#…]
[(tab) commands][#…]
方括弧中間的部分表示可選項。Targets和dependents當中可以包含字元、數字、句點和"/"符號。除了引用,commands中不能含有"#",也不允許換行。
在通常的情況下命令行參數中只含有一個":",此時command序列通常和makefile文件中某些定義文件間依賴關系的描述行有關。如果與目標相關連的那些描述行指定了相關的command序列,那麼就執行這些相關的command命令,即使在分號和(tab)後面的aommand欄位甚至有可能是NULL。如果那些與目標相關連的行沒有指定command,那麼將調用系統默認的目標文件生成規則。
如果命令行參數中含有兩個冒號"::",則此時的command序列也許會和makefile中所有描述文件依賴關系的行有關。此時將執行那些與目標相關連的描述行所
指向的相關命令。同時還將執行build-in規則。
如果在執行command命令時返回了一個非"0"的出錯信號,例如makefile文件中出現了錯誤的目標文件名或者出現了以連字元打頭的命令字元串,make操作一般會就此終止,但如果make後帶有"-i"參數,則make將忽略此類出錯信號。
Make命本身可帶有四種參數:標志、宏定義、描述文件名和目標文件名。其標准形式為:
Make [flags] [macro definitions] [targets]
Unix系統下標志位flags選項及其含義為:
-f file 指定file文件為描述文件,如果file參數為"-"符,那麼描述文件指向標准輸入。如果沒有"-f"參數,則系統將默認當前目錄下名為makefile或者名為Makefile的文件為描述文件。在Linux中, GNU make 工具在當前工作目錄中按照GNUmakefile、makefile、Makefile的順序搜索 makefile文件。
-i 忽略命令執行返回的出錯信息。
-s 沉默模式,在執行之前不輸出相應的命令行信息。
-r 禁止使用build-in規則。
-n 非執行模式,輸出所有執行命令,但並不執行。
-t 更新目標文件。
-q make操作將根據目標文件是否已經更新返回"0"或非"0"的狀態信息。
-p 輸出所有宏定義和目標文件描述。
-d Debug模式,輸出有關文件和檢測時間的詳細信息。
Linux下make標志位的常用選項與Unix系統中稍有不同,下面我們只列出了不同部分:
-c dir 在讀取 makefile 之前改變到指定的目錄dir。
-I dir 當包含其他 makefile文件時,利用該選項指定搜索目錄。
-h help文擋,顯示所有的make選項。
-w 在處理 makefile 之前和之後,都顯示工作目錄。
通過命令行參數中的target ,可指定make要編譯的目標,並且允許同時定義編譯多個目標,操作時按照從左向右的順序依次編譯target選項中指定的目標文件。如果命令行中沒有指定目標,則系統默認target指向描述文件中第一個目標文件。
通常,makefile 中還定義有 clean 目標,可用來清除編譯過程中的中間文件,例如:
clean:
rm -f *.o
運行 make clean 時,將執行 rm -f *.o 命令,最終刪除所有編譯過程中產生的所有中間文件。
隱含規則
在make 工具中包含有一些內置的或隱含的規則,這些規則定義了如何從不同的依賴文件建立特定類型的目標。Unix系統通常支持一種基於文件擴展名即文件名後綴的隱含規則。這種後綴規則定義了如何將一個具有特定文件名後綴的文件(例如.c文件),轉換成為具有另一種文件名後綴的文件(例如.o文件):
.c:.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
系統中默認的常用文件擴展名及其含義為:
.o 目標文件
.c C源文件
.f FORTRAN源文件
.s 匯編源文件
.y Yacc-C源語法
.l Lex源語法
在早期的Unix系統系統中還支持Yacc-C源語法和Lex源語法。在編譯過程中,系統會首先在makefile文件中尋找與目標文件相關的.C文件,如果還有與之相依賴的.y和.l文件,則首先將其轉換為.c文件後再編譯生成相應的.o文件;如果沒有與目標相關的.c文件而只有相關的.y文件,則系統將直接編譯.y文件。
而GNU make 除了支持後綴規則外還支持另一種類型的隱含規則--模式規則。這種規則更加通用,因為可以利用模式規則定義更加復雜的依賴性規則。模式規則看起來非常類似於正則規則,但在目標名稱的前面多了一個 % 號,同時可用來定義目標和依賴文件之間的關系,例如下面的模式規則定義了如何將任意一個 file.c 文件轉換為 file.o 文件:
%.c:%.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
#EXAMPLE#
下面將給出一個較為全面的示例來對makefile文件和make命令的執行進行進一步的說明,其中make命令不僅涉及到了C源文件還包括了Yacc語法。本例選自"Unix
Programmer's Manual 7th Edition, Volume 2A" Page 283-284
下面是描述文件的具體內容:
#Description file for the Make command
#Send to print
P=und -3 | opr -r2
#The source files that are needed by object files
FILES= Makefile version.c defs main.c donamc.c misc.c file.c \
dosys.c gram.y lex.c gcos.c
#The definitions of object files
OBJECTS= vesion.o main.o donamc.o misc.o file.o dosys.o gram.o
LIBES= -LS
LINT= lnit -p
CFLAGS= -O
make: $(OBJECTS)
cc $(CFLAGS) $(OBJECTS) $(LIBES) -o make
size make
$(OBJECTS): defs
gram.o: lex.c
cleanup:
-rm *.o gram.c
install:
@size make /usr/bin/make
cp make /usr/bin/make ; rm make
#print recently changed files
print: $(FILES)
pr $? | $P
touch print
test:
make -dp | grep -v TIME>1zap
/usr/bin/make -dp | grep -v TIME>2zap
diff 1zap 2zap
rm 1zap 2zap
lint: dosys.c donamc.c file.c main.c misc.c version.c gram.c
$(LINT) dosys.c donamc.c file.c main.c misc.c version.c \
gram.c
rm gram.c
arch:
ar uv /sys/source/s2/make.a $(FILES)
通常在描述文件中應象上面一樣定義要求輸出將要執行的命令。在執行了make命令之後,輸出結果為:
$ make
cc -c version.c
cc -c main.c
cc -c donamc.c
cc -c misc.c
cc -c file.c
cc -c dosys.c
yacc gram.y
mv y.tab.c gram.c
cc -c gram.c
cc version.o main.o donamc.o misc.o file.o dosys.o gram.o \
-LS -o make
13188+3348+3044=19580b=046174b
最後的數字信息是執行"@size make"命令的輸出結果。之所以只有輸出結果而沒有相應的命令行,是因為"@size make"命令以"@"起始,這個符號禁止列印輸出它所在的命令行。
描述文件中的最後幾條命令行在維護編譯信息方面非常有用。其中"print"命令行的作用是列印輸出在執行過上次"make print"命令後所有改動過的文件名稱。系
統使用一個名為print的0位元組文件來確定執行print命令的具體時間,而宏$?則指向那些在print文件改動過之後進行修改的文件的文件名。如果想要指定執行print命令後,將輸出結果送入某個指定的文件,那麼就可修改P的宏定義:
make print "P= cat>zap"
在Linux中大多數軟體提供的是源代碼,而不是現成的可執行文件,這就要求用戶根據自己系統的實際情況和自身的需要來配置、編譯源程序後,軟體才能使用。只有掌握了make工具,才能讓我們真正享受到到Linux這個自由軟體世界的帶給我們無窮樂趣。
9. 如何在linux下寫makefile
在命令行新建一個文件,名字叫Makefile:touch Makefile
然後用vi打開Makefile
在裡面寫:
test:
gcc test.c -o test // 這里自己改文件名字
保存退出
然後執行make命令就行。
10. 在linux系統應用make命令時,makefile 與makefile有何區別
分析linux
make命令與Makefile的區別:
1、make命令有一些內置的默認功能,但是光有這個還是不知道怎麼build程序。必須提供一個文件告訴make應用程序的構造,這個文件就是makefile。
2、Make和makefile提供了強大的功能來管理項目的編譯以及發布install到指定文件夾。
3、make的原理是執行一個叫Makefile文件里的指令,make的基本用處是自動根據makefile里的指令來編譯源文件。還可以用來做比如安裝軟體,卸載軟體等事情,但前提是在makefile里寫了。
4、比如makefile里有這么些內容:
install
:
<
commands
>
然後用make
install的話,make程序就會按照上面install:後面的指令<
commands
>執行安裝,uninstall也是一樣的道理,大部分的作者會寫有卸載的部分,這時只要簡單地執行make
unistall就可以,如果作者懶沒有寫,那就只有根據make
install中的步驟,把什麼文件拷到哪去了,然後分別手動刪除。還有關鍵的一點是,編譯安裝完成後,不要刪除源代碼,不然就算作者寫了unnistall目標,也沒有makefile可以執行了。