婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux里Makefile是什么?它是如何工作的?

Linux里Makefile是什么?它是如何工作的?

熱門標簽:地圖標注需要提交啥資料入駐 新鄉(xiāng)人工智能電話機器人加盟 400電話申請找哪家公司 福州呼叫中心外呼系統(tǒng)哪家好 昆明外呼系統(tǒng) 河南省鄭州市地圖標注 臨汾電銷機器人費用 七大洲地圖標注 地圖標注w是什么方向

用這個方便的工具來更有效的運行和編譯你的程序
makefile是用于自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接-----但是不是所有的文件都需要重新編譯,makefile能夠紀錄文件的信息,決定在鏈接的時候需要重新編譯哪些文件!

當你需要在一些源文件改變后運行或更新一個任務時,通常會用到 make 工具。make 工具需要讀取一個 Makefile(或 makefile)文件,在該文件中定義了一系列需要執(zhí)行的任務。你可以使用 make 來將源代碼編譯為可執(zhí)行程序。大部分開源項目會使用 make 來實現(xiàn)最終的二進制文件的編譯,然后使用 make install 命令來執(zhí)行安裝。
本文將通過一些基礎和進階的示例來展示 make 和 Makefile 的使用方法。在開始前,請確保你的系統(tǒng)中安裝了 make。

基礎示例
依然從打印 “Hello World” 開始。首先創(chuàng)建一個名字為 myproject 的目錄,目錄下新建 Makefile 文件,文件內容為:

say_hello:
echo "Hello World"

在 myproject 目錄下執(zhí)行 make,會有如下輸出:

$ make
echo "Hello World"
Hello World

在上面的例子中,“say_hello” 類似于其他編程語言中的函數(shù)名。這被稱之為 目標(target)。在該目標之后的是預置條件或依賴。為了簡單起見,我們在這個示例中沒有定義預置條件。echo ‘Hello World' 命令被稱為 步驟(recipe)。這些步驟基于預置條件來實現(xiàn)目標。目標、預置條件和步驟共同構成一個規(guī)則。

總結一下,一個典型的規(guī)則的語法為:

目標: 預置條件
<TAB> 步驟

作為示例,目標可以是一個基于預置條件(源代碼)的二進制文件。另一方面,預置條件也可以是依賴其他預置條件的目標。

final_target: sub_target final_target.c
Recipe_to_create_final_target
sub_target: sub_target.c
Recipe_to_create_sub_target

目標并不要求是一個文件,也可以只是步驟的名字,就如我們的例子中一樣。我們稱之為“偽目標”

再回到上面的示例中,當 make 被執(zhí)行時,整條指令 echo "Hello World" 都被顯示出來,之后才是真正的執(zhí)行結果。如果不希望指令本身被打印處理,需要在 echo 前添加 @

say_hello:
@echo "Hello World"

重新運行 make,將會只有如下輸出:

$ make
Hello World

接下來在 Makefile 中添加如下偽目標:generate 和 clean:

say_hello:
@echo "Hello World"
generate:
@echo "Creating empty text files..."
touch file-{1..10}.txt
clean:
@echo "Cleaning up..."
rm *.txt

隨后當我們運行 make 時,只有 say_hello 這個目標被執(zhí)行。這是因為Makefile 中的第一個目標為默認目標。通常情況下會調用默認目標,這就是你在大多數(shù)項目中看到 all 作為第一個目標而出現(xiàn)。all 負責來調用它他的目標。我們可以通過 .DEFAULT_GOAL 這個特殊的偽目標來覆蓋掉默認的行為。

在 Makefile 文件開頭增加 .DEFAULT_GOAL:

.DEFAULT_GOAL := generate

make 會將 generate 作為默認目標:

$ make
Creating empty text files...
touch file-{1..10}.txt

顧名思義,.DEFAULT_GOAL 偽目標僅能定義一個目標。這就是為什么很多 Makefile 會包括 all 這個目標,這樣可以調用多個目標。
下面刪除掉 .DEFAULT_GOAL,增加 all 目標:

all: say_hello generate
say_hello:
@echo "Hello World"
generate:
@echo "Creating empty text files..."
touch file-{1..10}.txt
clean:
@echo "Cleaning up..."
rm *.txt

運行之前,我們再增加一些特殊的偽目標。.PHONY 用來定義這些不是文件的目標。make 會默認調用這些偽目標下的步驟,而不去檢查文件名是否存在或最后修改日期。完整的 Makefile 如下:

.PHONY: all say_hello generate clean
all: say_hello generate
say_hello:
@echo "Hello World"
generate:
@echo "Creating empty text files..."
touch file-{1..10}.txt
clean:
@echo "Cleaning up..."
rm *.txt

make 命令會調用 say_hello 和 generate:

$ make
Hello World
Creating empty text files...
touch file-{1..10}.txt

clean 不應該被放入 all 中,或者被放入第一個目標中。clean 應當在需要清理時手動調用,調用方法為 make clean

$ make clean
Cleaning up...
rm *.txt

現(xiàn)在你應該已經對 Makefile 有了基礎的了解,接下來我們看一些進階的示例。

進階示例
變量
在之前的實例中,大部分目標和預置條件是已經固定了的,但在實際項目中,它們通常用變量和模式來代替。

定義變量最簡單的方式是使用 = 操作符。例如,將命令 gcc 賦值給變量 CC:

CC = gcc

這被稱為遞歸擴展變量,用于如下所示的規(guī)則中:

hello: hello.c
${CC} hello.c -o hello

你可能已經想到了,這些步驟將會在傳遞給終端時展開為:

gcc hello.c -o hello

${CC} 和 $(CC) 都能對 gcc 進行引用。但如果一個變量嘗試將它本身賦值給自己,將會造成死循環(huán)。讓我們驗證一下:

CC = gcc
CC = ${CC}
all:
@echo ${CC}

此時運行 make 會導致:

$ make
Makefile:8: *** Recursive variable 'CC' references itself (eventually). Stop.

為了避免這種情況發(fā)生,可以使用 := 操作符(這被稱為簡單擴展變量)。以下代碼不會造成上述問題:

CC := gcc
CC := ${CC}
all:
@echo ${CC}

模式和函數(shù)
下面的 Makefile 使用了變量、模式和函數(shù)來實現(xiàn)所有 C 代碼的編譯。我們來逐行分析下:

# Usage:
# make # compile all binary
# make clean # remove ALL binaries and objects
.PHONY = all clean
CC = gcc # compiler to use
LINKERFLAG = -lm
SRCS := $(wildcard *.c)
BINS := $(SRCS:%.c=%)
all: ${BINS}
%: %.o
@echo "Checking.."
${CC} ${LINKERFLAG} $< -o $@
%.o: %.c
@echo "Creating object.."
${CC} -c $<
clean:
@echo "Cleaning up..."
rm -rvf *.o ${BINS}

以 # 開頭的行是評論
.PHONY = all clean 行定義了 all 和 clean 兩個偽目標。
變量 LINKERFLAG 定義了在步驟中 gcc 命令需要用到的參數(shù)。
SRCS := $(wildcard *.c):$(wildcard pattern) 是與文件名相關的一個函數(shù)。在本示例中,所有 “.c”后綴的文件會被存入 SRCS 變量。
BINS := $(SRCS:%.c=%):這被稱為替代引用。本例中,如果 SRCS 的值為 'foo.c bar.c',則 BINS的值為 'foo bar'。
all: ${BINS} 行:偽目標 all 調用 ${BINS} 變量中的所有值作為子目標。
規(guī)則:

%: %.o
@echo "Checking.."
${CC} ${LINKERFLAG} $< -o $@

下面通過一個示例來理解這條規(guī)則。假定 foo 是變量 ${BINS} 中的一個值。% 會匹配到 foo(%匹配任意一個目標)。下面是規(guī)則展開后的內容:

foo: foo.o
@echo "Checking.."
gcc -lm foo.o -o foo

如上所示,% 被 foo 替換掉了。$< 被 foo.o 替換掉。$<用于匹配預置條件,$@ 匹配目標。對 ${BINS} 中的每個值,這條規(guī)則都會被調用一遍。
規(guī)則:

%.o: %.c
@echo "Creating object.."
${CC} -c $<

之前規(guī)則中的每個預置條件在這條規(guī)則中都會都被作為一個目標。下面是展開后的內容:

foo.o: foo.c
@echo "Creating object.."
gcc -c foo.c

最后,在 clean 目標中,所有的二進制文件和編譯文件將被刪除。
下面是重寫后的 Makefile,該文件應該被放置在一個有 foo.c 文件的目錄下:

# Usage:
# make # compile all binary
# make clean # remove ALL binaries and objects
.PHONY = all clean
CC = gcc # compiler to use
LINKERFLAG = -lm
SRCS := foo.c
BINS := foo
all: foo
foo: foo.o
@echo "Checking.."
gcc -lm foo.o -o foo
foo.o: foo.c
@echo "Creating object.."
gcc -c foo.c
clean:
@echo "Cleaning up..."
rm -rvf foo.o foo

這些和到一起,就是makefile,當然這些功能還太少,可以加上很多別的項目。但宗旨就是:讓編譯器知道要編譯一個文件需要依賴其他的哪些文件。當那些依賴文件有了改變,編譯器會自動的發(fā)現(xiàn)最終的生成文件已經過時,而重新編譯相應的模塊。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽:股票 紅河 ???/a> 鎮(zhèn)江 四川 臨沂 岳陽 烏海

巨人網(wǎng)絡通訊聲明:本文標題《Linux里Makefile是什么?它是如何工作的?》,本文關鍵詞  Linux,里,Makefile,是什么,它是,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux里Makefile是什么?它是如何工作的?》相關的同類信息!
  • 本頁收集關于Linux里Makefile是什么?它是如何工作的?的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美体内she精高潮| 悠悠色在线精品| 久久9热精品视频| 亚洲人成网站色在线观看| 日韩欧美在线123| 色狠狠色狠狠综合| 国产ts人妖一区二区| 日本va欧美va精品发布| 亚洲一区二区三区视频在线| 国产精品久久久久永久免费观看| 日韩欧美在线网站| 在线综合视频播放| 欧美日韩国产一区| 色94色欧美sute亚洲线路一ni | 精品成人佐山爱一区二区| 欧美综合天天夜夜久久| 成人av高清在线| 国产精品99精品久久免费| 韩国一区二区视频| 国产一区二区三区观看| 狠狠色狠狠色合久久伊人| 精品亚洲porn| 国产高清精品在线| 粉嫩一区二区三区性色av| 国产大片一区二区| 成人黄色电影在线 | 国产色一区二区| 久久九九国产精品| 国产精品青草综合久久久久99| 欧美国产精品一区二区三区| 国产精品私人影院| 洋洋av久久久久久久一区| 亚洲第一福利视频在线| 美女一区二区久久| 成人自拍视频在线观看| 99免费精品在线| 久久精品视频一区二区三区| 精品久久人人做人人爽| 久久综合给合久久狠狠狠97色69| 久久综合久久综合久久| 国产精品国模大尺度视频| 亚洲精品成人悠悠色影视| 五月天激情综合| 国产乱妇无码大片在线观看| 91免费看视频| 日韩免费视频一区| 国产精品久久久久久久久免费相片 | 欧美羞羞免费网站| 制服丝袜中文字幕一区| 久久久精品一品道一区| 椎名由奈av一区二区三区| 午夜精品久久久久久久| 国产成人小视频| 欧美日韩在线不卡| 欧美国产日韩在线观看| 亚洲国产精品精华液网站| 久久99这里只有精品| 91网址在线看| 欧美变态tickle挠乳网站| 中日韩免费视频中文字幕| 婷婷久久综合九色综合伊人色| 国产精品一区专区| 欧美人妇做爰xxxⅹ性高电影| 国产色综合久久| 日本欧美在线观看| 色婷婷av一区二区三区软件| 精品国产一区二区三区不卡| 亚洲欧美日韩中文播放| 国产一区二区三区在线观看免费视频 | 成人免费观看av| 337p亚洲精品色噜噜狠狠| 中文字幕在线观看不卡| 韩日av一区二区| 欧美一级xxx| 亚洲成人av资源| 一本大道久久a久久精二百| 国产欧美一区二区精品性| 蜜桃91丨九色丨蝌蚪91桃色| 欧美性三三影院| 一区二区三区不卡在线观看 | 福利电影一区二区| 日韩欧美高清在线| 免费一级欧美片在线观看| 欧美精品在线一区二区三区| 亚洲精品中文在线影院| jizzjizzjizz欧美| 欧美国产精品一区二区三区| 国产美女娇喘av呻吟久久| 精品久久久久一区二区国产| 免费观看91视频大全| 制服丝袜中文字幕亚洲| 亚洲va欧美va国产va天堂影院| 91精彩视频在线| 亚洲一二三四区| 欧美三级韩国三级日本一级| 粉嫩高潮美女一区二区三区| 亚洲精品一区在线观看| 亚洲午夜在线视频| 国产精品成人网| 91麻豆精品国产91久久久久久久久| 日韩制服丝袜先锋影音| 一区av在线播放| 蜜臀国产一区二区三区在线播放| 久久激情五月婷婷| 一区二区三区蜜桃| 成人一区二区三区在线观看| 久久夜色精品国产噜噜av| 捆绑调教美女网站视频一区| 91麻豆精品久久久久蜜臀| 日韩精品高清不卡| 91精品国产91热久久久做人人| 午夜精品久久久久久久99樱桃| 欧美日韩不卡一区| 天天综合网天天综合色| 日韩欧美高清dvd碟片| 麻豆精品一区二区| 亚洲精品一区二区三区影院| 国产精品资源在线看| av综合在线播放| 色综合久久久久综合体| 色哟哟国产精品| 国产精品狼人久久影院观看方式| 成人永久免费视频| 中文字幕一区二区三中文字幕| 色播五月激情综合网| 日日夜夜一区二区| 精品国产99国产精品| 成人国产精品免费网站| 亚洲图片欧美色图| 欧美mv和日韩mv国产网站| 国产盗摄精品一区二区三区在线 | 亚洲aaa精品| 欧美α欧美αv大片| av在线一区二区三区| 爽爽淫人综合网网站| 国产视频一区二区三区在线观看| 色伊人久久综合中文字幕| 欧美三级乱人伦电影| 在线亚洲人成电影网站色www| 中文字幕在线一区| 69久久夜色精品国产69蝌蚪网| 久久99久久99| 亚洲欧美日韩国产中文在线| 精品久久久网站| 色呦呦网站一区| 国产伦精一区二区三区| 午夜伊人狠狠久久| 亚洲同性gay激情无套| 欧美videos中文字幕| 色婷婷激情久久| 日本高清不卡aⅴ免费网站| 蜜桃在线一区二区三区| 伊人婷婷欧美激情| 久久网站热最新地址| 欧美日韩小视频| 一本一本久久a久久精品综合麻豆| 国产在线精品一区二区三区不卡| 亚洲成人免费视| ...中文天堂在线一区| 久久久久久9999| 欧美精品一区二| 欧美一区二区三区四区高清| 日本道色综合久久| 成人av在线看| 成人精品视频一区二区三区尤物| 精品一区二区三区免费观看 | 国产精品女同互慰在线看| 制服丝袜成人动漫| 欧美午夜精品一区二区三区| 91香蕉视频mp4| av在线综合网| 风间由美性色一区二区三区| 国产精品亚洲午夜一区二区三区 | 91精品国产麻豆| 精品视频1区2区| 欧美日韩亚洲高清一区二区| 欧美视频在线一区二区三区 | jlzzjlzz亚洲女人18| 成人永久看片免费视频天堂| 成人高清伦理免费影院在线观看| 国产成人av电影在线| 成人小视频在线| voyeur盗摄精品| 91麻豆自制传媒国产之光| 色婷婷久久99综合精品jk白丝| 91日韩精品一区| 欧美色综合久久| 91精品蜜臀在线一区尤物| 精品少妇一区二区三区日产乱码| 精品日韩99亚洲| 欧美高清一级片在线观看| 国产精品久久久久久户外露出| 成人av午夜电影| 在线精品视频免费观看| 91精品欧美福利在线观看| 国产日韩欧美a| 亚洲一区二区四区蜜桃| 美国十次了思思久久精品导航| 麻豆精品一区二区三区| 国产 日韩 欧美大片|