真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C編譯:makefile基礎(chǔ)


教大家一個(gè) makefile基礎(chǔ)教學(xué)

為錦州等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及錦州網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、錦州網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

在編譯一個(gè)大型項(xiàng)目的時(shí)候,往往有很多目標(biāo)文件、庫(kù)文件、頭文件以及最終的可執(zhí)行文件。不同的文件之間存在依賴關(guān)系(dependency)。比如當(dāng)我們使用下面命令編譯時(shí):

$gcc -c -o test.o test.c

$gcc -o helloworld test.o

可執(zhí)行文件helloworld依賴于test.o進(jìn)行編譯的,而test.o依賴于test.c。

 依賴關(guān)系

在我們編譯一個(gè)大型項(xiàng)目時(shí),我們往往要很多次的調(diào)用編譯器,來根據(jù)依賴關(guān)系,逐步編譯整個(gè)項(xiàng)目。這樣的方式是自下而上的,即先編譯下游文件,再編譯上游文件。

 

UNIX系統(tǒng)下的make工具用于自動(dòng)記錄和處理文件之間的依賴關(guān)系。我們不用輸入大量的"gcc"命令,而只需調(diào)用make就可以完成整個(gè)編譯過程。所有的依賴關(guān)系都記錄在makefile文本文件中。我們只需要make helloworld,make會(huì)根據(jù)依賴關(guān)系,自上而下的找到編譯該文件所需的所有依賴關(guān)系,最后再自下而上的編譯。

(make有多個(gè)版本,本文將基于GNU make。make會(huì)自動(dòng)搜索當(dāng)前目錄下的makefile, Makefile或者GNUmakefile)

 

依賴

 
基本概念

我們使用一個(gè)示例C語(yǔ)言文件:
復(fù)制代碼

#include

/*
 * By Vamei
 * test.c for makefile demo
 */
int main()
{
    printf("Hello world!\n");
    return 0;
}

復(fù)制代碼

 

下面是一個(gè)簡(jiǎn)單的makefile
復(fù)制代碼

# helloworld is a binary file
helloworld: test.o
echo "good"
gcc -o helloworld test.o

test.o: test.c
gcc -c -o test.o test.c

復(fù)制代碼

 

觀察上面的makefile

    #號(hào)起始的行是注釋行
    target: prerequisite為依賴關(guān)系,即目標(biāo)文件(target)依賴于前提文件(prerequisite)。可以有多個(gè)前提文件,用空格分開。
    依賴關(guān)系后面的縮進(jìn)行是實(shí)現(xiàn)依賴關(guān)系進(jìn)行的操作,即正常的UNIX命令。一個(gè)依賴關(guān)系可以附屬有多個(gè)操作。

用直白的話說,就是:

    想要helloworld嗎?那你必須有test.o,并執(zhí)行附屬的操作。
    如果沒有test.o,那你必須搜索其他依賴關(guān)系,并創(chuàng)建test.o。

 

我們執(zhí)行

$make helloworld

來創(chuàng)建helloworld。

 

make是一個(gè)遞歸創(chuàng)建的過程:

    Base Case 1: 如果當(dāng)前依賴關(guān)系中沒有說明前提文件,那么直接執(zhí)行操作。
    Base Case 2: 如果當(dāng)前依賴關(guān)系說明了目標(biāo)文件,而目標(biāo)文件所需的前提文件已經(jīng)存在,而且前提文件與上次make時(shí)沒有發(fā)生改變(根據(jù)最近寫入時(shí)間判斷),也直接執(zhí)行該依賴關(guān)系的操作。
    如果當(dāng)前目標(biāo)文件依賴關(guān)系所需的前提文件不存在,或者前提文件發(fā)生改變,那么以前提文件為新的目標(biāo)文件,尋找依賴關(guān)系,創(chuàng)建目標(biāo)文件。

虛線: 依賴關(guān)系檢索

 

上面是make的核心功能。有了上面的功能,我們可以記錄項(xiàng)目中所有的依賴關(guān)系和相關(guān)操作,并使用make進(jìn)行編譯。下面的內(nèi)容都是在此核心內(nèi)容上的拓展。

 


make中可以使用宏(MACRO)。宏類似于文本類型的變量。比如下面的CC:
復(fù)制代碼

CC = gcc

# helloworld is a binary file
helloworld: test.o
echo "good"
$(CC) -o helloworld test.o

test.o: test.c
$(CC) -c -o test.o test.c

復(fù)制代碼

 

我們用CC來代表"gcc"。在makefile中,使用$(CC)的方式來調(diào)用宏的值。make會(huì)在運(yùn)行時(shí),使用宏的值(gcc)來替代$(CC)。

shell的環(huán)境變量可以直接作為宏調(diào)用。如果同一個(gè)自定義的宏同時(shí)也有同名環(huán)境環(huán)境變量,make將優(yōu)先使用自定義宏。

(可以使用$make -e helloworld來優(yōu)先使用環(huán)境變量)

 

類似于C語(yǔ)言的宏,makefile中的宏可以方便的管理一些固定出現(xiàn)的文本,并方便替換操作。比如我們未來使用ifort編譯器時(shí),只需要更改宏定義為:

CC = ifort

就可以了

 
內(nèi)部宏

make中有內(nèi)部定義的宏,可以直接使用。$@中包含有當(dāng)前依賴關(guān)系的目標(biāo)文件名,而$^包含當(dāng)前目標(biāo)的前提文件:
復(fù)制代碼

CC = gcc

# helloworld is a binary file
helloworld: test.o
echo $@
$(CC) -o $@ $^

test.o: test.c
$(CC) -c -o $@ $^

復(fù)制代碼

 

內(nèi)部宏       功能

$*          當(dāng)前依賴關(guān)系中的目標(biāo)文件名,不包括后綴。

$*          當(dāng)前依賴關(guān)系中,發(fā)生改變的前提文件

$$          字符"$"

 

如果目標(biāo)或者前提文件是一個(gè)完整路徑,我們可以附加D和F來提取文件夾部分和文件名部分,比如$(@F)表示目標(biāo)文件的文件名部分。

 
后綴依賴

在makefile中使用

.SUFFIXES: .c .o

來說明.c和.o是后綴。

 

我們可以使用后綴依賴的方式,比如:
復(fù)制代碼

CC = gcc

.SUFFIXES: .c .o

.c.o:
        $(CC) -c -o $@ $^

#--------------------------

# helloworld is a binary file
helloworld: test.o
        echo $@
        $(CC) -o $@ $^

test.o: test.c

復(fù)制代碼

我們定義.c和.o為后綴。并有后綴依賴關(guān)系.c.o:。前者為前提,后者為目標(biāo)。(注意,與一般的依賴關(guān)系順序不同)

上面的test.o和test.c有依賴關(guān)系,但沒有操作。make會(huì)發(fā)現(xiàn)該依賴關(guān)系符合.c.o的后綴依賴,并執(zhí)行該后綴依賴后面的操作。

 

如果項(xiàng)目很大型的時(shí)候,后綴依賴非常有用。符合后綴依賴的文件往往有類似的操作,我們可以將這些操作用后綴依賴表示,而避免重復(fù)輸入。

 
其他

makefile的續(xù)行符為\

 

makefile中經(jīng)常會(huì)定義下面依賴關(guān)系:

all:

如果make后沒有跟隨文件名,那么將執(zhí)行該依賴關(guān)系。

clean:

常用于清理歷史文件。

 

比如:
復(fù)制代碼

CC = gcc

.SUFFIXES: .c .o

.c.o:
        $(CC) -c -o $@ $^

#--------------------------

all: helloworld
        @echo "ALL"

# helloworld is a binary file
helloworld: test.o
        @echo $@
        $(CC) -o $@ $^

test.o: test.c

clean:
        -rm helloworld *.o

復(fù)制代碼

注意: echo前面的@和rm前面的-。@后的命令將不顯示命令本身。-后面的命令將忽略錯(cuò)誤(比如刪除不存在的文件)。

 
總結(jié)

make的核心功能是根據(jù)依賴關(guān)系來實(shí)現(xiàn)編譯管理。

make的其他功能是讓用戶可以更加便捷的寫出makefile。


網(wǎng)頁(yè)題目:C編譯:makefile基礎(chǔ)
文章鏈接:http://weahome.cn/article/pidodp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部