亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

基于make命令與makefile文件詳解

2020-01-26 13:49:22
字體:
來源:轉載
供稿:網友

一、多個源文件帶來的問題

在編寫c/c++測試程序時,我們習慣每次修改一處代碼,然后就馬上編譯運行來查看運行的結果。這種編譯方式對于小程序來說是沒有多大問題的,可對于大型程序來說,由于包含了大量的源文件,如果每次改動一個地方都需要編譯所有的源文件,這個簡單的直接編譯所有源文件方式對程序員來說簡直是噩耗。

我們看一個例子:

// main.c#include "a.h"http:// 2.c#include "a.h"#include "b.h"http:// 3.c#include "b.h"#include "c.h"

如果程序員只修改了頭文件c.h,則源文件main.c和2.c都無需編譯,因為它們不依賴這個頭文件。而對3.c來說,由于它包含了c.h,所以在頭文件c.h改動后,就必須得新編譯。

而如果改動了b.h可是忘記編譯了2.c,那么最終的程序就可能無法正常工作。

make 工具就是為了解決上述問題而出現的,它會在必要時重新編譯所有受改動影響的源文件。

二、make 命令

make命令本身支持許多選項,最常用的是-f選項。如果我們直接運行

make

那么make命令會首先在當前目錄查找名為makefile的文件,如果找不到,就會查找名為Makefile的文件。

為了指示make命令將哪個文件作為makefile文件,可以使用 -f 選項:

make -f Makefile1

三、makefile 文件

上面提到makefile文件,那么什么是makefile文件呢?

make命令功能雖然十分強大,但是光憑其自身無法了解如何構建應用程序的。這時,makefile就出來了,它告訴make應用程序如何構建的。make命令和makefile文件的結合提供了一個在管理項目的十分強大的工具,它們不僅用于控制源文件的編譯,而且還提供了將應用程序安裝到目標目錄等其他功能。

3.1 依賴關系

依賴關系定義了應用程序里面每個文件與其他源文件之間的關系。例如在上面的例子中,我們可以定義最終應用程序依賴于目標文件main.o,2.o和3.o。同樣,main.o依賴于main.c和a.h,2.o依賴于2.c,a.h和b.h,3.o依賴于3.c,b.h和c.h。

在makefile文件中,依賴關系的寫法是:先寫目標的名稱,然后緊跟一個冒號,接著是空格或者制表符tab,最后是用空格或者制表符tab隔開的文件列表。上面的例子的依賴關系如下:

myapp: main.o 2.o 3.omain.o: main.c a.h2.o: 2.c a.h b.h3.o: 3.c b.h c.h

這組依賴關系形成一個層次結構,展示了源文件之間的關系。例如,如果源文件b.h發生改變,就需要重新編譯2.o和3.o,接下來還需要重新編譯myapp。

3.2 規則

makefiel文件中的規則定義了目標的創建方式。在上面的例子中,我們使用gcc -c 2.c創建2.o。這個gcc命令即是目標2.o的創建方式,也即是規則。

在makefile文件中,規則都必須以tab開頭。

在源文件所在的目錄下創建Makefile1文件,其內容如下。

myapp: main.o 2.o 3.o gcc -o myapp main.o 2.o 3.omain.o: main.c a.h gcc -c main.c2.o: 2.c a.h b.h gcc -c 2.c3.o: 3.c b.h c.h gcc -c 3.c

三個頭文件a.h,b.h,c.h內容都為空,源文件的內容如下:

/* main.c */#include <stdlib.h>#include "a.h"extern void function_two();extern void function_three();int main(){ function_two(); function_three(); exit(EXIT_SUCCESS);}
/* 2.c */#include <stdio.h>#include "a.h"#include "b.h"void function_two() { printf("function two/n");}
/* 3.c */#include <stdio.h>#include "b.h"#include "c.h"void function_three() { printf("function three/n");}

執行make命令,:

$ make -f Makefile1 gcc -c main.c gcc -c 2.c gcc -c 3.c gcc -o myapp main.o 2.o 3.o

運行應用程序:

$ ./myapp function two function three

從輸出可以說明應用程序已被正確構建。

如果改變b.h頭文件,makefile能夠正確處理這一變化,只有2.c和3.c發生重新編譯:

$ touch b.h$ make -f Makefile1 gcc -c 2.c gcc -c 3.c gcc -o myapp main.o 2.o 3.o

3.3 注釋

makefile文件使用#來表示注釋,一直延續到這一行的結束。

3.4 宏

不同的平臺下可能使用不同的編譯器,不同的環境(例如開發與線上環境)也可能使用不同的編譯器選項,為了便于修改makefile這些可變的參數,我們可以使用宏來實現makefile。

makefile引用宏定義的方法為$(MACRONAME)。我們來看如何使用宏來改寫上面的makefile文件。

all: myapp# 編譯器CC = gcc# include的搜索路徑INCLUDE = .# 編譯器參數CFLAGS = -g -Wall -ansimyapp: main.o 2.o 3.o $(CC) -o myapp main.o 2.o 3.omain.o: main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c2.o: 2.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c3.o: 3.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

我們習慣在makefile文件中將第一個目標定義為all,然后再列出其他從屬的目標,上面的makefile也遵循這個約定。

運行make命令:

$ make -f Makefile2 gcc -I. -g -Wall -ansi -c main.c gcc -I. -g -Wall -ansi -c 2.c gcc -I. -g -Wall -ansi -c 3.c gcc -o myapp main.o 2.o 3.o

同樣也正確構建了應用程序myapp。

3.5 多個目標

makefile文件除了定義編譯的目標外,還可以定義其他的目標。例如,增加一個clean選項來刪除不需要的目標文件,增加一個install選項來將編譯成功的應用程序安裝到另一個目錄下,等等。

all: myappCC = gccINSTDIR = /usr/local/binINCLUDE = .CFLAGS = -g -Wall -ansimyapp: main.o 2.o 3.o $(CC) -o myapp main.o 2.o 3.omain.o: main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c2.o: 2.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c3.o: 3.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.cclean: -rm main.o 2.o 3.oinstall: myapp @if [ -d $(INSTDIR) ]; /  then /  cp myapp $(INSTDIR);/  chmod a+x $(INSTDIR)/myapp;/  chmod og-w $(INSTDIR)/myapp;/  echo "Install in $(INSTDIR)";/ else /  echo "sorry, $(INSTDIR) does not exist";/ fi

上面的makefile文件有幾點需要注意的。

(1)特殊目標all只指定了myapp這個目標,因此,在執行make命令時未指定目標,它的默認行為就是創建目標myapp。

(2)目標clean用來測試編譯過程中產生的中間文件。

(3)目標install用于將應用程序安裝到指定目錄,它依賴于myapp,即執行install前須先創建myapp。install目標由shell腳本組成,由于make命令在執行規則時會調用一個shell,并且會針對每個規則使用一個新的shell,所以必須在上面每行代碼的結尾加上一個/,讓所有的shell腳本都處于同一行。

腳本以@開頭,說明make在執行這些規則之前不會在標準輸出顯示命令本身。

創建myapp:

$ make -f Makefile3 gcc -I. -g -Wall -ansi -c main.c gcc -I. -g -Wall -ansi -c 2.c gcc -I. -g -Wall -ansi -c 3.c gcc -o myapp main.o 2.o 3.o

將myapp安裝到指到目錄:

$ make -f Makefile3 install Install in /usr/local/bin

然后可以直接執行myapp:

$ myapp function two function three

刪除中間文件:

$ make -f Makefile3 clean rm main.o 2.o 3.o

以上這篇基于make命令與makefile文件詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩国产精品| 欧美影院在线播放| 57pao成人国产永久免费| 97视频免费在线观看| 国产日韩欧美在线视频观看| 欧美成人午夜视频| 亚洲最大福利视频| 2023亚洲男人天堂| 日韩av最新在线| 国产精品久久久久高潮| 国产精品久久久久久久久久久久久久| 欧洲成人在线视频| 中文字幕日韩在线视频| 国产精品久久久久av| 91亚洲精品视频| 中文字幕一区二区三区电影| 日韩免费高清在线观看| 久久最新资源网| 亚洲va国产va天堂va久久| 成人午夜激情网| 日本国产精品视频| 亚洲加勒比久久88色综合| 亚洲精品视频二区| 欧美性在线观看| 久久激情视频久久| 国产欧美在线播放| 久99久在线视频| 欧美又大又粗又长| 欧美视频国产精品| 91免费精品视频| 国产丝袜精品第一页| 国产一区二区三区在线播放免费观看| 国产亚洲精品激情久久| 欧美亚洲国产日韩2020| 欧美性理论片在线观看片免费| 国产精品丝袜一区二区三区| 狠狠色香婷婷久久亚洲精品| 成人免费网站在线| 亚洲国产精品大全| 国产欧美欧洲在线观看| 91精品在线一区| 国产成人精品优优av| 亚洲天堂色网站| 亚洲午夜未满十八勿入免费观看全集| 国产精品一区二区三区久久| 亚洲第一页自拍| 国产99久久精品一区二区| 久久久国产精品一区| 亚洲理论电影网| 久久91亚洲人成电影网站| 日韩电影网在线| 精品女厕一区二区三区| 久久久久久com| 国产精品看片资源| 亚洲精品久久久久中文字幕二区| 亚洲男人第一网站| 欧美性猛交xxxx偷拍洗澡| 国产精品欧美日韩久久| 久久久久久久久综合| 日韩中文字幕视频在线观看| 亚洲激情视频在线| 亚洲精品aⅴ中文字幕乱码| 日韩成人av网址| 国产精品视频专区| 亚洲影视九九影院在线观看| 成人免费xxxxx在线观看| 精品国产一区二区三区久久久狼| 亚洲国产精品久久精品怡红院| 中文字幕日韩在线播放| 国产精品一区二区久久久久| 国产精品久久久久久久久久久久久久| 久久久久亚洲精品成人网小说| 久久青草精品视频免费观看| 久久香蕉国产线看观看av| 中文字幕日韩欧美在线视频| 92福利视频午夜1000合集在线观看| 97视频网站入口| 亚洲视频在线看| 亚洲欧洲在线看| 久久久久国产精品免费网站| 国产精品久久久久久久久久久久久| 欧美午夜精品伦理| 欧美成人在线网站| 欧美最猛黑人xxxx黑人猛叫黄| 欧美性猛交xxxx富婆弯腰| 久久亚洲精品视频| 日本不卡高字幕在线2019| 美女999久久久精品视频| xxxxx91麻豆| 日韩经典中文字幕| 亚洲午夜未删减在线观看| 亚洲精品视频免费在线观看| 国产精品国产三级国产aⅴ浪潮| 亚洲欧美中文字幕在线一区| 狠狠色狠狠色综合日日小说| 欧美日韩美女视频| 欧美激情aaaa| 国产欧美精品在线| 在线视频欧美日韩| www.美女亚洲精品| 欧美成年人视频网站| 国产精品亚洲欧美导航| 伊人av综合网| 亚洲国产精品久久久久秋霞蜜臀| 亚洲国产另类 国产精品国产免费| 日韩福利视频在线观看| 国产精品久久综合av爱欲tv| 日韩av中文字幕在线| 成人网页在线免费观看| 亚洲福利在线看| 久久久www成人免费精品张筱雨| 亚洲精品久久久一区二区三区| 91精品在线观| 5252色成人免费视频| 久久久久久久久久国产精品| 日韩欧美有码在线| 亚洲激情中文字幕| 国产视频亚洲视频| 国产偷国产偷亚洲清高网站| 国产亚洲精品美女久久久| 国产精品免费视频xxxx| 97视频在线观看免费高清完整版在线观看| 亚洲一区www| 国产精品久久一区| 亚洲级视频在线观看免费1级| 久久久久久久久网站| 欧美性xxxx极品hd欧美风情| 中日韩美女免费视频网站在线观看| 成人免费视频在线观看超级碰| 日韩中文字在线| 精品视频在线导航| 日本亚洲欧洲色| 日韩电影中文字幕| 国产精品99导航| 成人在线小视频| 精品久久久999| 亚洲一级片在线看| 日韩免费在线电影| 狠狠躁夜夜躁人人躁婷婷91| 欧美日韩福利在线观看| 欧美激情一级二级| 国产suv精品一区二区三区88区| 国产美女久久精品| 动漫精品一区二区| 欧美精品手机在线| 亚洲激情 国产| 亚洲欧美国产精品专区久久| 国产精品第8页| 欧美日韩亚洲一区二| 午夜精品一区二区三区在线视频| 国产精品电影观看| 自拍偷拍免费精品| 欧美性猛交xxxx免费看久久久| 午夜精品久久久久久久男人的天堂| 国产成人啪精品视频免费网| 日本欧美国产在线| 91精品久久久久久久久久另类| 色婷婷亚洲mv天堂mv在影片| 97在线视频国产| 国产视频999| 国产成人免费av电影| 国产精品日韩专区| 国产一区二区三区在线| 另类图片亚洲另类|