綜合知識

當前位置 /首頁/綜合知識 > /列表

makefile怎麼寫

1. makefile怎麼寫

如果你想寫 Makefile 的話,那麼你只要用一個不將製表符過濾掉的文本編輯器就可以了,用 vi/vim 可以,用 emacs 可以,用其它的 geditor 也是可以的,只要是文本編輯器就可以了。你在 win 下也可以用記事本寫 Makefile ,當然要確保你的系統已經安裝了 make 了(最好了 GNU make)。Makefile 是不需要後綴的,也就是説 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沒有太多的註釋,因為是用於小測試的。希望對你有所幫助。

TAG標籤:makefile #