?? build_makefile.txt
字號(hào):
1:作用
Make工具最主要也是最基本的功能就是通過(guò)makefile文件來(lái)描述源程序之間的相互關(guān)系并自動(dòng)維護(hù)編譯工作。而makefile 文件需要按照某種語(yǔ)法進(jìn)行編寫(xiě),文件中需要說(shuō)明如何編譯各個(gè)源文件并連接生成可執(zhí)行文件,并要求定義源文件之間的依賴(lài)關(guān)系。makefile 文件是許多編譯器--包括 Windows NT 下的編譯器--維護(hù)編譯信息的常用方法,只是在集成開(kāi)發(fā)環(huán)境中,用戶通過(guò)友好的界面修改 makefile 文件而已。
在 UNIX 系統(tǒng)中,習(xí)慣使用 Makefile 作為 makfile 文件。如果要使用其他文件作為 makefile,則可利用類(lèi)似下面的 make 命令選項(xiàng)指定 makefile 文件:
$ make -f Makefile.debug
2:格式:
在Makefile中也#開(kāi)始的行都是注釋行.Makefile中最重要的是描述文件的依賴(lài)關(guān)系的說(shuō)明。一般的格式是:
target:components1 components2
TAB rule
第一行表示的是依賴(lài)關(guān)系。第二行是規(guī)則。
target后面各個(gè)元素是以空格分隔的。
第一個(gè)rule距離頂格就是一個(gè)Tab的間隔。
---------------------------------------------------------
#It is a example for describing makefile
prog : filea.o fileb.o filec.o
gcc filea.o fileb.o filec.o -LS -o prog
filea.o : filea.c a.h defs
gcc -c filea.c
fileb.o : fileb.c b.h defs
gcc -c fileb.c
filec.o : filec.c c.h
gcc -c filec.c
----------------------------------------------------------
這個(gè)描述文檔就是一個(gè)簡(jiǎn)單的makefile文件。
上面的例子注意到,第一個(gè)字符為 # 的行為注釋行。第一個(gè)非注釋行指定prog由三個(gè)目標(biāo)文件filea.o、fileb.o和filec.o鏈接生成。第三行描述了如何從prog所依賴(lài)的 文件建立可執(zhí)行文件。接下來(lái)的4、6、8行分別指定三個(gè)目標(biāo)文件,以及它們所依賴(lài)的.c和.h文件以及defs文件。而5、7、9行則指定了如何從目標(biāo)所依賴(lài)的文件建立目標(biāo)。
當(dāng)filea.c或a.h文件在編譯之后又被修改,則 make 工具可自動(dòng)重新編譯filea.o,如果在前后兩次編譯之間,filea.C 和a.h 均沒(méi)有被修改,而且 test.o 還存在的話,就沒(méi)有必要重新編譯。這種依賴(lài)關(guān)系在多源文件的程序編譯中尤其重要。通過(guò)這種依賴(lài)關(guān)系的定義,make 工具可避免許多不必要的編譯工作。當(dāng)然,利用 Shell 腳本也可以達(dá)到自動(dòng)編譯的效果,但是,Shell 腳本將全部編譯任何源文件,包括哪些不必要重新編譯的源文件,而 make 工具則可根據(jù)目標(biāo)上一次編譯的時(shí)間和目標(biāo)所依賴(lài)的源文件的更新時(shí)間而自動(dòng)判斷應(yīng)當(dāng)編譯哪個(gè)源文件。
3:Makefile有三個(gè)非常有用的變量
Makefile文件作為一種描述文檔一般需要包含以下內(nèi)容:
◆ 宏定義
◆ 源文件之間的相互依賴(lài)關(guān)系
◆ 可執(zhí)行的命令
Makefile中允許使用簡(jiǎn)單的宏指代源文件及其相關(guān)編譯信息,在Linux中也稱(chēng)宏為變量。在引用宏時(shí)只需在變量前加$符號(hào),但值得注意的是,如果變量名的長(zhǎng)度超過(guò)一個(gè)字符,在引用時(shí)就必須加圓括號(hào)()。
下面都是有效的宏引用:
$(CFLAGS)
$2
$Z
$(Z)
其中最后兩個(gè)引用是完全一致的。
$@ -- 目標(biāo)文件,
$^ -- 所有的依賴(lài)文件,
$< -- 第一個(gè)依賴(lài)文件。
//---------------------------------
//*************一個(gè)例子
//---------------------------------
//-----------------------------------------------------------------------------
/* main.c */
#include "mytool1.h"
#include "mytool2.h"
intmain( void )
{
mytool1_print("hello");
mytool2_print("hello");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
voidmytool1_print(char *print_str);
#endif
/* mytool1.c */
#include "mytool1.h"
voidmytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
voidmytool2_print(char *print_str);
#endif
/* mytool2.c */
#include "mytool2.h"
voidmytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}
當(dāng)然由于這個(gè)程序是很短的我們可以這樣來(lái)編譯:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
如果我們使用上面三個(gè)變量,那么我們可以簡(jiǎn)化我們的Makefile文件為:
# 這是簡(jiǎn)化后的Makefile
v
main:main.o mytool1.o mytool2.o
gcc -o $@ $^ //$@ 就是main, $^就是main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c $< //$<就是main.c
mytool1.o:mytool1.c mytool1.h
gcc -c $< //$<就是mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c $< //$<就是mytool2.c
經(jīng)過(guò)簡(jiǎn)化后我們的Makefile是簡(jiǎn)單了一點(diǎn),不過(guò)人們有時(shí)候還想簡(jiǎn)單一點(diǎn)。這里我們學(xué)習(xí)一個(gè)Makefile的缺省規(guī)則
.c.o:
gcc -c $<
這個(gè)規(guī)則表示所有的 .o文件都是依賴(lài)與相應(yīng)的.c文件的。例如mytool.o依賴(lài)于mytool.c這樣Makefile還可以變?yōu)椋?
# 這是再一次簡(jiǎn)化后的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
最常見(jiàn)的書(shū)寫(xiě)方式:
CC = gcc
LD = ld
STRIP = strip
CFLAGS := -Os -static -DEZ_OS_LINUX
CLFLAGS := -Os -static
all: main
EXEC = main
OBJS = main.o mytool1.o mytool2.o
INCS = mytool1.h mytool2.h
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS)
$(STRIP) $@
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
%.o: %.c $(INCS)
$(CC) $(CFLAGS) -c $< -o $@
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -