當前位置:首頁 » 編程軟體 » 如何編譯makefile

如何編譯makefile

發布時間: 2023-02-17 15:35:50

❶ 如何自己編寫Makefile

相信很多朋友都有過這樣的經歷,看著開源項目中好幾頁的makefile文件,不知所雲。在日常學習和工作中,也有意無意的去迴避makefile,能改就不寫,能用ide就用ide。其實makefile並沒有想像的那麼難寫,只要你明白了其中的原理,自己實踐幾次。你也可以自己寫makefile,讓別人對你頭來羨慕的目光。

下面本人介紹一下自己的學習成果,初學階段,歡迎大家多多指正。

簡單的說,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至可以在makefile中執行shell腳本。makefile帶來的好處就是——「自動化編譯」,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。

關於程序的編譯和鏈接

一般來說,無論是C還是C++,首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o
文件,即 Object File,這個動作叫做編譯(compile),一般來說,每個源文件都應該對應於一個中間目標文件(O文件或是OBJ文件)。然後再把大量的Object
File合成執行文件,這個動作叫作鏈接(link)。

編譯時,編譯器需要的是語法的正確,函數與變數的聲明的正確。對於後者,通常是你需要告訴編譯器頭文件的所在位置(頭文件中應該只是聲明,而定義應該放在C/C++文件中),只要所有的語法正確,編譯器就可以編譯出中間目標文件。

鏈接時,主要是鏈接函數和全局變數,所以,我們可以使用這些中間目標文件(O文件或是OBJ文件)來鏈接我們的應用程序。鏈接器並不管函數所在的源文件,只管函數的中間目標文件(Object
File),在大多數時候,由於源文件太多,編譯生成的中間目標文件太多,而在鏈接時需要明顯地指出中間目標文件名,這對於編譯很不方便,所以,我們要給中間目標文件打個包,在Windows下這種包叫「庫文件」(Library
File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

下面我們開始看看如何自己寫出makefile。

Makefile的規則

目標 :
需要的條件 (注意冒號兩邊有空格)

命令(注意前面用tab鍵開頭)

解釋一下:

1
目標可以是一個或多個,可以是Object File,也可以是執行文件,甚至可以是一個標簽。

2
需要的條件就是生成目標所需要的文件或目標

3
命令就是生成目標所需要執行的腳本

總結一下,就是說一條makefile規則規定了編譯的依賴關系,也就是目標文件依賴於條件,生成規則用命令來描述。在編譯時,如果需要的條件的文件比目標更新的話,就會執行生成命令來更新目標。

下面舉個簡單的例子說明。如果一個工程有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文件中,然後執行make就可以進行編譯,執行make
clean就可以刪除所有目標文件。解釋一下,也就是說生成最終的目標文件edit,依賴於一系列的.o目標文件,而這些.o文件又是需要用源文件來編譯生成的。

需要注意的是,clean後面沒有條件,而clean本身也不是文件,它只不過是一個動作名字,其冒號後什麼也沒有,那麼,make就不會自動去找文件的依賴性,也就不會自動執行其後所定義的命令。

make是如何工作的

在默認的方式下,也就是我們只輸入make命令。那麼,

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了。

makefile中使用變數

前面的知識已經足以讓你自己完成一個簡單的makefile了,不過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 = main.o kbd.o command.o display.o
/
insert.o search.o files.o utils.o

這樣一來,原來的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自動推導

GNU的make很強大,它可以自動推導文件以及文件依賴關系後面的命令,於是我們就沒必要去在每一個[.o]文件後都寫上類似的命令,因為,我們的make會自動識別,並自己推導命令。

只要make看到一個[.o]文件,它就會自動的把[.c]文件加在依賴關系中,如果make找到一個whatever.o,那麼whatever.c,就會是whatever.o的依賴文件。並且
cc -c whatever.c
也會被推導出來,於是,我們的makefile再也不用寫得這么復雜。我們的是新的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 : defs.h
kbd.o :
defs.h command.h
command.o : defs.h command.h
display.o : defs.h
buffer.h
insert.o : defs.h buffer.h
search.o : defs.h
buffer.h
files.o : defs.h buffer.h command.h
utils.o :
defs.h

clean :
rm edit
$(objects)

當然,如果你覺得那麼多[.o]和[.h]的依賴有點不爽的話,好吧,沒有問題,這個對於make來說很容易,誰叫它提供了自動推導命令和文件的功能呢?來看看最新風格的makefile吧。

objects = main.o kbd.o command.o display.o
/
insert.o search.o files.o utils.o

edit : $(objects)

cc -o edit $(objects)

$(objects) : defs.h
kbd.o
command.o files.o : command.h
display.o insert.o search.o files.o :
buffer.h
clean :
rm edit $(objects)

❷ 在VC里如何用Makefile文件編譯

運行cmd.exe (or command.com in win9x)->進到vc/bin目錄->運行vc-vars32.bat->進到makefile 所在的目錄->nmake /f makefile
從sourceforge上下載下來的libjpeg源代碼中有一個makefile.vc的文件,可以通過nmake /f makefile.vc [nodebug=1]來編譯libjpeg,但是只能編譯靜態庫,如果需要編譯dll以便在emacs等程序中使用的話,需要修改makefile.vc和jmorecfg.h文件。在makefile.vc文件中添加編譯dll規則:
以下內容為程序代碼:
libjpeg.lib: $(LIBOBJECTS) $(RM) libjpeg.lib lib -out:libjpeg.lib $(LIBOBJECTS) #
添加以下這行 libjpeg.dll: $(LIBOBJECTS) $(RM) libjpeg.dll link -dll -out:libjpeg.dll $(LIBOBJECTS) 在jmorecfg.h中添加#define _WIN32_#define JPEG_DLL 然後nmake /f makefile.vc nodebug=1就可以編譯了。
將makefile復制為一個.mak文件,然後用VC打開即可!
.mak 就是一個makefile
可以指定怎樣編譯(命令行,必須先設置VC命令行環境)
vcvars32.bat可設置環境,在vc98/bin下 nmake /f XXXX.mak
如果有一個makefile就只要nmake就可以了。

❸ 利用makefile實現c語言項目編譯

本周操作系統課的實驗是用c語言實現10個進程調度演算法。這個項目中有多個.h頭文件和.c源文件,利用makefile可以很輕松地找到所有項目文件之間的關系並實現編譯。

雖然makefile的基本框架學校已經提供的,但身為c語言小白,連如何利用make指令來使用這份makefile都不知道,更別說要往這裡面增加自己添加的文件。就記錄下這篇筆記給自己以及需要的朋友參考。

先貼上這份makefile,注釋是自己後來添加的:

在終端進入makefile所在的目錄,使用make,就可以使用我們在makefile中申明的指令,如debug、run和clean。

http://www.ruanyifeng.com/blog/2015/02/make.html

https://blog.csdn.net/zhaocuit/article/details/74782789

❹ 如何編寫makefile

你先用gcc把它給編譯出來。然後再想用makefile

gcc最一般的用法就是:
gcc -o 要生成的可執行文件名 源代碼文件名
如:gcc -o hello.x hello.c
如果一些頭文件要指明的話,可以這樣:
gcc -o hello.x -I頭文件所在的文件夾 -l一些庫名 hello.c
最通常,我們用到一些數學庫。gcc -o hello.x -lm hello.c

makefile的話,你可以基於上述的語句進行修改:建議你看點資料,或一些典型的例子。但是注意的是規則那一行,得用Tab鍵打頭。
hello.x : hello.o
gcc -o hello.x hello.o (這一行,得用Tab打頭)
hello.o : hello.c 頭文件
gcc -c hello.o hello.c -I頭文件所在目錄 -lm (這一行,得用Tab打頭)

❺ 有makefile文件怎麼編譯

makefile不是被編譯的,它是用來指導編譯器和鏈接器來編譯程序源文件的,這個文件也是個文本文件,具體格式你可以在網上查一下。

❻ 如何使用Makefile自動編譯iPhone程序

makefile裡面所寫的內容其實就是你要編譯的命令,那麼,什麼是編譯命令呢?
假寫你已經寫好一個程序代碼,並將之存在一個.c文件中,如:hello.c,在終端上你可以這樣做!在終端上輸入gcc -o hello hello.c
然後回車,看一看有沒有什麼反映,如果沒有打出很多英文的話,恭喜你!你完美地完成了第一步!然後,在終端中輸入./hello 看看是不是有什麼輸出了?
現在來解釋一下編譯命令:上面的命令的意思就是,使用gcc編譯器編譯hello.c源代碼,生成的文件名稱叫做hello.最後,要看程序運行結果,就要運行生成的程序也就是「./hello」了,「./」的意思就是在當前的目錄下運行。
而makefile中內容的就是上面的編譯命令,如:在makefile文件中寫入
Hello:hello.c
gcc -o Hello hello.c
保存文件之後直接在終端中輸入make,就完成編譯了!makefile存在的意義只是讓編譯更加方便,也就說,可以把所以的編譯都寫在一個makefile文件中,然後在終端中輸入make就可以完成makefile文件里的命令!
建議還是先將C語言入門,然後再學使用makefile編譯程序吧!因為剛開始的時候不用編譯很多文件,如果一個文件要編寫一個makefile文件的話,那豈不是很繁?

❼ 編譯esal/c程序的makefile文件如何寫

你可以根據這樣的方法來編寫:
b074@gliethttp:~/work/gunzip$
cat
Makefile
CC
=
gcc-4.1
LD
=
gcc-4.1
CFLAGS
=
-Wall
-c
-Dgliethttp
-I.
LDFLAGS
=
-lpthread
SRCS
=
$(wildcard
*.c)
OBJS
=
$(patsubst
%c,%o,$(SRCS))
TARGET
=
gliethttp
.PHONY:
all
clean
all:
$(TARGET)
$(TARGET):
$(OBJS)
$(LD)
$(LDFLAGS)
-o
$@
$^
%o:
%c
$(CC)
$(CFLAGS)
-o
$@
$<
clean:
@rm
-f
*.o
$(TARGET)
編譯當前Makefile所在目錄下的所有.c文件
執行
make
make
clean

❽ Makefile詳解

make 命令執行時,需要根據一些規則來決定按照怎麼樣的方式去 編譯和鏈接程序 ,這些規則就由 makefile 文件所指定。如果我們 makefile 文件寫的足夠好,make 命令會自動地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。

首先,本文將給出一個makefile文件的示例,以便大家能有一個直觀感受,這個例子來源於 GNU的make使用手冊 。在這個例子中,我們的工程有8個c文件,和3個頭文件,我們要寫一個makefile來告訴make命令如何編譯和鏈接這幾個文件。例子如下:

這個例子里 make 的編碼規則如下:

a. 如果這個工程沒有編譯過,那麼我們的所有c文件都要編譯並被鏈接。
b. 如果這個工程的某幾個c文件被修改,那麼我們只編譯被修改的c文件,並鏈接目標程序。
c. 如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的c文件,並鏈接目標程序。

在詳細拆解上一節的 Makefile 之前,先來看下 Makefile 的基本範式。

target可以是一個 1) object file(可執行文件) ,2) 可執行文件 ,還可以是個3) label(標簽) ,關於標簽這個特性,在後面的 偽目標 章節還會有敘述。

prerequisites 就是,要生成那個target所需要的文件或是目標。 command 也就是 make 需要執行的命令,可以是任意的
shell 命令。

這是一個文件的依賴關系,也就是說,target 這一個或多個的目標文件依賴於 prerequisites 中的文件,其生成規則定義在 command 中。同時, prerequisites 中如果有一個以上的文件比target文件要新的話, command 所定義的命令就會被執行。這就是 Makefile 的規則,也是 Makefile 中 最核心 的內容。

有了這些規則後,再來分析上面的例子。在這個 makefile 中,目標文件(target)包含:

依賴文件(prerequisites)就是冒號後面的那些 .c 文件和 .h 文件。每一個 .o 文件都有一組依賴文件,而這些 .o 文件又是執行文件 edit 的依賴文件。

在定義好依賴關系後,後續的那一行定義了如何生成目標文件的系統命令, 一定要以一個tab鍵作為開頭 。 make 會比較
targets 文件和 prerequisites 文件的修改日期,如果 prerequisites 文件的日期要比targets文件的日期要新,或者 target 不存在的話,那麼,make就會執行後續定義的命令。

我們可以把這個內容保存在名字為 makefile 或 Makefile 的文件中,然後在該目錄下直接輸入命令 make 就可以生成可執行文件edit。如果要刪除執行文件和所有的中間目標文件,那麼,只要簡單地執行一下 make clean 就可以了。 註:反斜線()是換行符的意思,這樣比較便於閱讀。

這里要說明一點的是, clean 不是一個文件,它只不過是一個動作名字,有點像C語言中的 lable 一樣,其冒號後什麼也沒有,那麼,make就不會去找它的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令(不僅用於 clean,其他 lable 同樣適用),就要在 make 命令後顯式指出這個 lable 的名字。這樣的方法非常有用, 我們可以在一個 makefile 中定義不用的編譯或是和編譯無關的命令,比如程序的打包,程序的備份 ,等等。

在默認的方式下,也就是我們只輸入make命令。那麼,

這就是整個 make 的依賴性,make 會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最後被依賴的文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,這些都不在 make 職責范圍內。

通過上述分析,我們知道,像 clean 這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,我們可以顯示要 make 執行。即命令 make clean ,以此來清除所有的目標文件,以便重編譯。

在上面的例子中可以看到,後綴為 .o 的一大串文件名寫了兩次,這樣比較費時費力,而且如果文件有所增減,要修改的地方也非常多,對以後的維護造成困難。在這種情形下,我們可以在Makefile里使用變數代替這一大串依賴文件,這里變數的使用方式基本類似於shell腳本里變數的使用方法。

我們可以在makefile一開始就這樣定義:

那麼接下來我們就可以很方便地在我們的Makefile中以 $(objects) 的方式來使用這個變數了,於是如果有新的 .o 文件加入,我們只需簡單地修改一下 objects 變數就可以了。

GNU 的 make 很強大,它可以自動推導文件以及文件依賴關系後面的命令,於是我們就沒必要去在每一個 .o 文件後都寫上類似的命令。因為,我們的make會自動識別,並自己推導命令。

只要make看到一個 .o 文件,它就會自動的把 .c 文件加在依賴關系中,如果make找到一個 FILENAME.o ,那麼 FILENAME.c ,就會是 FILENAME.o 的依賴文件。並且 cc -c FILENAME.c 也會被推導出來,於是,我們的makefile 再也不用寫得這么復雜。我們的新makefile就可以這么寫了。

這種方法,也就是make的**。上面文件內容中,「.PHONY」表示,clean是個偽目標文件。

❾ android的makefile文件是如何編譯的

android編譯系統的makefile文件Android.mk寫法如下 (1)Android.mk文件首先需要指定LOCAL_PATH變數,用於查找源文件。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:748
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:1010
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:718
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:878
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:774
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1124
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:349
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:227
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:911
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:875