jasmine214--love

          只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          Linux下C語言編程基礎(Makefile)[轉CU]

          Posted on 2010-12-28 17:30 幻海藍夢 閱讀(290) 評論(0)  編輯  收藏 所屬分類: LinuxC語言學習
          假設我們有下面這樣的一個程序,源代碼如下:

          /* main.c */ 

          #include "mytool1.h"

          #include "mytool2.h"

          int main(int argc,char **argv)

          {

          mytool1_print("hello");

          mytool2_print("hello");

          }

          /* 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)

          {

          printf("This is mytool1 print %s ",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)

          {

          printf("This is mytool2 print %s ",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.omytool2.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的規則,可以查看相應的文檔。

          原文:http://hi.baidu.com/mgqw/blog/item/2824bb01b72dfe067bec2c8c.html


          主站蜘蛛池模板: 灌阳县| 青田县| 铁岭县| 黑水县| 建湖县| 读书| 徐闻县| 织金县| 塘沽区| 嘉祥县| 留坝县| 阿尔山市| 正宁县| 屏边| 安乡县| 灵武市| 阿克陶县| 闽清县| 稻城县| 雅安市| 林州市| 临颍县| 常宁市| 永修县| 和龙市| 怀仁县| 红河县| 盐津县| 漳平市| 霍城县| 湘乡市| 和林格尔县| 合肥市| 西昌市| 迁安市| 云和县| 浦城县| 邵阳市| 德昌县| 靖边县| 镇赉县|