makefile怎麼寫
如果你想寫 Makefile 的話,那麼你只要用一個不將製表符過濾掉的文本編輯器就可以了,用 vi/vim 可以,用 emacs 可以,用其它的 geditor 也是可以的,只要是文本編輯器就可以了。你在 win 下也可以用記事本寫 Makefile ,當然要確保你的系統已經安裝了 make 了(最好了 GNU make)。Makefile 是不需要後綴的,也就是説 Makefile 的文件名就是 Makefile。
下面我給出一個我寫的一個簡單的 Makefile 給你參考一下吧:
# Makefile for 'kmp'
CC=gcc
CFLAGS=-g
kmp: kmpindex.o getnext.o main.o
$(CC) -o kmp kmpindex.o getnext.o main.o
kmpindex.o: kmpindex.c kmp.h
$(CC) -c kmpindex.c
getnext.o: getnext.c kmp.h
$(CC) -c getnext.c
main.o: main.c kmp.h
$(CC) -c main.c
clean:
rm -f *.o
# END
沒有太多的註釋,因為是用於小測試的。希望對你有所幫助
2. 如何自己編寫Makefile什麼是makefile?或許很多Winodws的程序員都不知道這個東西,因為那些Windows的IDE都為你做了這個工作,但我覺得要作一個好的和professional的程序員,makefile還是要懂。
這就好像現在有這麼多的HTML的編輯器,但如果你想成為一個專業人士,你還是要了解HTML的標識的含義。特別在Unix下的軟件編譯,你就不能不自己寫makefile了,會不會寫makefile,從一個側面説明了一個人是否具備完成大型工程的能力。
因為,makefile關係到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。
makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來説,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
可見,makefile都成為了一種在工程方面的編譯方法。現在講述如何寫makefile的文章比較少,這是我想寫這篇文章的原因。
當然,不同產商的make各不相同,也有不同的語法,但其本質都是在“文件依賴性”上做文章,這裏,我僅對GNU的make進行講述,我的環境是RedHat Linux 8.0,make的版本是3.80。必竟,這個make是應用最為廣泛的,也是用得最多的。
而且其還是最遵循於IEEE 1003.2-1992 標準的(POSIX.2)。在這篇文檔中,將以C/C++的源碼作為我們基礎,所以必然涉及一些關於C/C++的編譯的知識,相關於這方面的內容,還請各位查看相關的編譯器的文檔。
這裏所默認的編譯器是UNIX下的GCC和CC。
3. 如何寫一個簡單的makefile一:makefile 雛形:
#makefile的撰寫是基於規則的,當然這個規則也是很簡單的,就是:
#target : prerequisites
command //任意的shell 命令
實例如下:
makefile:
helloworld : main.o print.o #helloword 就是我們要生成的目標
# main.o print.o是生成此目標的先決條件
gcc -o helloworld main.o print.o#shell命令,最前面的一定是一個tab鍵
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld main.o print.o
OK,一個簡單的makefile製作完畢,現成我們輸入 make,自動調用Gcc編譯了,
輸入 make clean就會刪除 hellowworld mian.o print.o
二:小步改進:
在上面的例子中我們可以發現 main.o print.o 被定義了多處,
我們是不是可以向C語言中定義一個宏一樣定義它呢?當然可以:
makefile:
objects = main.o print.o #應該叫變量的聲明更合適
helloworld : $(objects) //聲明瞭變量以後使用就要$()了
gcc -o helloworld$(objects)
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld $(objects)
修改完畢,這樣使用了變量的話在很多文件的工程中就能體現出方便性了。
三:再進一步:
再看一下,為沒一個*.o文件都寫一句gcc -c main.c是不是顯得多餘了,
能不能把它幹掉?而且 main.c 和print.c都需要print.h,為每一個都寫上是
不是多餘了,能不能再改進?
能,當然能了:
makefile:
objects = main.o print.o
helloworld : $(objects)
gcc -o helloworld$(objects)
$(objects) : print.h # 都依賴print.h
mian.o : mian.c #幹掉了gcc -c main.c 讓Gun make自動推導了。
print.o : print.c
clean :
rm helloworld $(objects)
4. 如何編寫makefile你先用gcc把它給編譯出來。
然後再想用makefilegcc最一般的用法就是:gcc -o 要生成的可執行文件名 源代碼文件名如:gcc -o hello.x hello.c如果一些頭文件要指明的話,可以這樣:gcc -o hello.x -I頭文件所在的文件夾 -l一些庫名 hello.c最通常,我們用到一些數學庫。gcc -o hello.x -lm hello.cmakefile的話,你可以基於上述的語句進行修改:建議你看點資料,或一些典型的例子。
但是注意的是規則那一行,得用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打頭)。
5. 如何寫makefile?CC=gcc
TARGET=compute
DEPEND=compute.o mymath.o
$(TARGET):$(DEPEND)
(這前面是一個TAB鍵,不要有空格)$(CC) -o $@ $^ -g -Wall
.c.o:
(這前面是一個TAB鍵,不要有空格) $(CC) -c $^ -g
.PHONY:clean
clean:
(這前面是一個TAB鍵,不要有空格) rm $(DEPEND)
#下面為説明
#Makefile的格式為Target(目標):depend(依賴)
# (TAB)command(生成目標的命令)
#其中:%@ 為目標,$^ 為所有的依賴文件,$
6. 如何寫一個簡單的makefile一:makefile 雛形:#makefile的撰寫是基於規則的,當然這個規則也是很簡單的,就是:#target : prerequisitescommand //任意的shell 命令實例如下:makefile:helloworld : main.o print.o #helloword 就是我們要生成的目標# main.o print.o是生成此目標的先決條件gcc -o helloworld main.o print.o#shell命令,最前面的一定是一個tab鍵mian.o : mian.c print.hgcc -c main.cprint.o : print.c print.hgcc -c print.cclean :rm helloworld main.o print.oOK,一個簡單的makefile製作完畢,現成我們輸入 make,自動調用Gcc編譯了,輸入 make clean就會刪除 hellowworld mian.o print.o二:小步改進:在上面的例子中我們可以發現 main.o print.o 被定義了多處,我們是不是可以向C語言中定義一個宏一樣定義它呢?當然可以:makefile:objects = main.o print.o #應該叫變量的聲明更合適helloworld : $(objects) //聲明瞭變量以後使用就要$()了gcc -o helloworld$(objects)mian.o : mian.c print.hgcc -c main.cprint.o : print.c print.hgcc -c print.cclean :rm helloworld $(objects)修改完畢,這樣使用了變量的話在很多文件的工程中就能體現出方便性了。
三:再進一步:再看一下,為沒一個*.o文件都寫一句gcc -c main.c是不是顯得多餘了,能不能把它幹掉?而且 main.c 和print.c都需要print.h,為每一個都寫上是不是多餘了,能不能再改進?能,當然能了:makefile:objects = main.o print.ohelloworld : $(objects)gcc -o helloworld$(objects)$(objects) : print.h # 都依賴print.hmian.o : mian.c #幹掉了gcc -c main.c 讓Gun make自動推導了。print.o : print.cclean :rm helloworld $(objects)。
7. linux makefile怎麼寫1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
INC_PATH := -I./include/
LIB_PATH := -L./lib/
LIBS := $(LIB_PATH) -lerr -larm
CC := gcc
LD := gcc
CFLAGS := -O2 -Wall $(INC_PATH)
SRC_PATH := ./source
SOURCE := $(SRC_PATH)/a.c
$(SRC_PATH)/b.c
$(SRC_PATH)/c.c
TARGET := target
OBJS := a.o b.o c.o
$(TARGET): $(OBJS)
$(LD) -O2 -o $(TARGET) $(OBJS) $(LIBS)
a.o : $(SRC_PATH)/a.c
$(CC) $(CFLAGS) -c -o $@ $
8. 如何編寫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打頭)
9. 如何自己編寫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 。
10. 如何寫Makefile文件如果你想寫 Makefile 的話,那麼你只要用一個不將製表符過濾掉的文本編輯器就可以了,用 vi/vim 可以,用 emacs 可以,用其它的 geditor 也是可以的,只要是文本編輯器就可以了。
你在 win 下也可以用記事本寫 Makefile ,當然要確保你的系統已經安裝了 make 了(最好了 GNU make)。Makefile 是不需要後綴的,也就是説 Makefile 的文件名就是 Makefile。
下面我給出一個我寫的一個簡單的 Makefile 給你參考一下吧:# Makefile for 'kmp'CC=gccCFLAGS=-gkmp: kmpindex.o getnext.o main.o $(CC) -o kmp kmpindex.o getnext.o main.okmpindex.o: kmpindex.c kmp.h $(CC) -c kmpindex.cgetnext.o: getnext.c kmp.h $(CC) -c getnext.cmain.o: main.c kmp.h $(CC) -c main.cclean: rm -f *.o# END沒有太多的註釋,因為是用於小測試的。希望對你有所幫助。