makefile檔案的編寫

2021-08-29 10:34:09 字數 3317 閱讀 2939

1.源程式的編譯

在linux下面,如果要編譯乙個c語言源程式,我們要使用gnu的gcc編譯器. 下面我們以乙個例項來說明如何使用gcc編譯器.

假設我們有下面乙個非常簡單的源程式(hello.c):

int main(int argc,char **argv)

要編譯這個程式,我們只要在命令列下執行:

gcc -o hello hello.c

gcc 編譯器就會為我們生成乙個hello的可執行檔案.執行./hello就可以看到程式的輸出結果了.命令列中 gcc表示我們是用gcc來編譯我們的源程式,-o 選項表示我們要求編譯器給我們輸出的可執行檔名為hello 而hello.c是我們的源程式檔案.

gcc編譯器有許多選項,一般來說我們只要知道其中的幾個就夠了. -o選項我們已經知道了,表示我們要求輸出的可執行檔名. -c選項表示我們只要求編譯器輸出目標**,而不必要輸出可執行檔案. -g選項表示我們要求編譯器在編譯的時候提供我們以後對程式進行除錯的資訊.

知道了這三個選項,我們就可以編譯我們自己所寫的簡單的源程式了,如果你想要知道更多的選項,可以檢視gcc的幫助文件,那裡有著許多對其它選項的詳細說明.

2.makefile的編寫

假設我們有下面這樣的乙個程式,源**如下:

/* main.c */

#include ""mytool1.h""

#include ""mytool2.h""

int main(int argc,char **argv)

/* mytool1.h */

#ifndef _mytool_1_h

#define _mytool_1_h

void mytool1_print(char *print_str);

#endif

/* mytool1.c */

#include ""mytool1.h""

void mytool1_print(char *print_str)

/* mytool2.h */

#ifndef _mytool_2_h

#define _mytool_2_h

void mytool2_print(char *print_str);

#endif

/* mytool2.c */

#include ""mytool2.h""

void mytool2_print(char *print_str)

當然由於這個程式是很短的我們可以這樣來編譯

gcc -c main.c

gcc -c mytool1.c

gcc -c mytool2.c

gcc -o main main.o mytool1.o mytool2.o

這樣的話我們也可以產生main程式,而且也不時很麻煩.但是如果我們考慮一下如果有一天我們修改了其中的乙個檔案(比如說mytool1.c)那麼我們難道還要重新輸入上面的命令?也許你會說,這個很容易解決啊,我寫乙個shell指令碼,讓她幫我去完成不就可以了.是的對於這個程式來說,是可以起到作用的.但是當我們把事情想的更複雜一點,如果我們的程式有幾百個源程式的時候,難道也要編譯器重新乙個乙個的去編譯?

為此,聰明的程式設計師們想出了乙個很好的工具來做這件事情,這就是make.我們只要執行以下make,就可以把上面的問題解決掉.在我們執行make之前,我們要先編寫乙個非常重要的檔案.makefile.對於上面的那個程式來說,可能的乙個makefile的檔案是:

# 這是上面那個程式的makefile檔案

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

有了這個makefile檔案,不過我們什麼時候修改了源程式當中的什麼檔案,我們只要執行make命令,我們的編譯器都只會去編譯和我們修改的檔案有關的檔案,其它的檔案她連理都不想去理的.

下面我們學習makefile是如何編寫的.

在makefile中也#開始的行都是注釋行.makefile中最重要的是描述檔案的依賴關係的說明.一般的格式是:

target: components

tab rule

第一行表示的是依賴關係.第二行是規則.

比如說我們上面的那個makefile檔案的第二行

main:main.o mytool1.o mytool2.o

表示我們的目標(target)main的依賴物件(components)是main.o mytool1.o mytool2.o 當倚賴的物件在目標修改後修改的話,就要去執行規則一行所指定的命令.就象我們的上面那個makefile第三行所說的一樣要執行 gcc -o main main.o mytool1.o mytool2.o 注意規則一行中的tab表示那裡是乙個tab鍵

makefile有三個非常有用的變數.分別是$@,$^,$ 《代表的意義分別是:

$@目標檔案,$^所有的依賴檔案,$ 《第乙個依賴檔案.

如果我們使用上面三個變數,那麼我們可以簡化我們的makefile檔案為:

# 這是簡化後的makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $ <

mytool1.o:mytool1.c mytool1.h

gcc -c $ <

mytool2.o:mytool2.c mytool2.h

gcc -c $ <

經過簡化後我們的makefile是簡單了一點,不過人們有時候還想簡單一點.這裡我們學習乙個makefile的預設規則

.c.o:

gcc -c $ <

這個規則表示所有的 .o檔案都是依賴與相應的.c檔案的.例如mytool.o依賴於mytool.c這樣makefile還可以變為:

# 這是再一次簡化後的makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

.c.o:

gcc -c $ <

好了,我們的makefile 也差不多了,如果想知道更多的關於makefile規則可以檢視相應的文件.

makefile檔案編寫

hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...

Makefile檔案編寫

1 基本大全教程 2 四個賦值的區別 是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值其中 和 的區別是 立馬賦值,是整個makefile檔案讀取完後賦值。1 make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile...

Makefile檔案編寫

main3.c 1 include 2 include static lib.h 3 include fun.h 4 5int main void static lib.h和 1 extern int add int a,int b 2 extern int sub int a,int b 3 ex...