欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Makefile 及其工作原理

https://www.toutiao.com/i6599850731023368707/



編譯自: https://opensource.com/article/18/8/what-how-makefile

作者: Sachin Patil

譯者: Zafiry

用這個(gè)方便的工具來(lái)更有效的運行和編譯你的程序。

當你需要在一些源文件改變后運行或更新一個(gè)任務(wù)時(shí),通常會(huì )用到 make 工具。make 工具需要讀取一個(gè) Makefile(或 makefile)文件,在該文件中定義了一系列需要執行的任務(wù)。你可以使用 make 來(lái)將源代碼編譯為可執行程序。大部分開(kāi)源項目會(huì )使用 make 來(lái)實(shí)現最終的二進(jìn)制文件的編譯,然后使用 make install 命令來(lái)執行安裝。

本文將通過(guò)一些基礎和進(jìn)階的示例來(lái)展示 make 和 Makefile 的使用方法。在開(kāi)始前,請確保你的系統中安裝了 make。

基礎示例

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

say_hello:

echo "Hello World"

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

$ make

echo "Hello World"

Hello World

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

總結一下,一個(gè)典型的規則的語(yǔ)法為:

目標: 預置條件

<TAB> 步驟

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

final_target: sub_target final_target.c

Recipe_to_create_final_target

sub_target: sub_target.c

Recipe_to_create_sub_target

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

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

say_hello:

@echo "Hello World"

重新運行 make,將會(huì )只有如下輸出:

$ make

Hello World

接下來(lái)在 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 時(shí),只有 say_hello 這個(gè)目標被執行。這是因為Makefile 中的第一個(gè)目標為默認目標。通常情況下會(huì )調用默認目標,這就是你在大多數項目中看到 all 作為第一個(gè)目標而出現。all 負責來(lái)調用它他的目標。我們可以通過(guò) .DEFAULT_GOAL 這個(gè)特殊的偽目標來(lái)覆蓋掉默認的行為。

在 Makefile 文件開(kāi)頭增加 .DEFAULT_GOAL:

.DEFAULT_GOAL := generate

make 會(huì )將 generate 作為默認目標:

$ make

Creating empty text files...

touch file-{1..10}.txt

顧名思義,.DEFAULT_GOAL 偽目標僅能定義一個(gè)目標。這就是為什么很多 Makefile 會(huì )包括 all 這個(gè)目標,這樣可以調用多個(gè)目標。

下面刪除掉 .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 用來(lái)定義這些不是文件的目標。make 會(huì )默認調用這些偽目標下的步驟,而不去檢查文件名是否存在或最后修改日期。完整的 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 命令會(huì )調用 say_hello 和 generate:

$ make

Hello World

Creating empty text files...

touch file-{1..10}.txt

clean 不應該被放入 all 中,或者被放入第一個(gè)目標中。clean 應當在需要清理時(shí)手動(dòng)調用,調用方法為 make clean。

$ make clean

Cleaning up...

rm *.txt

現在你應該已經(jīng)對 Makefile 有了基礎的了解,接下來(lái)我們看一些進(jìn)階的示例。

進(jìn)階示例

變量

在之前的實(shí)例中,大部分目標和預置條件是已經(jīng)固定了的,但在實(shí)際項目中,它們通常用變量和模式來(lái)代替。

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

CC = gcc

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

hello: hello.c

${CC} hello.c -o hello

你可能已經(jīng)想到了,這些步驟將會(huì )在傳遞給終端時(shí)展開(kāi)為:

gcc hello.c -o hello

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

CC = gcc

CC = ${CC}

all:

@echo ${CC}

此時(shí)運行 make 會(huì )導致:

$ make

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

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

CC := gcc

CC := ${CC}

all:

@echo ${CC}

模式和函數

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

# 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}

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

%: %.o

@echo "Checking.."

${CC} ${LINKERFLAG} $< -o $@

  • 下面通過(guò)一個(gè)示例來(lái)理解這條規則。假定 foo 是變量 ${BINS} 中的一個(gè)值。% 會(huì )匹配到 foo(%匹配任意一個(gè)目標)。下面是規則展開(kāi)后的內容:

foo: foo.o

@echo "Checking.."

gcc -lm foo.o -o foo

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

%.o: %.c

@echo "Creating object.."

${CC} -c $<

  • 之前規則中的每個(gè)預置條件在這條規則中都會(huì )都被作為一個(gè)目標。下面是展開(kāi)后的內容:

foo.o: foo.c

@echo "Creating object.."

gcc -c foo.c

  • 最后,在 clean 目標中,所有的二進(jìn)制文件和編譯文件將被刪除。

下面是重寫(xiě)后的 Makefile,該文件應該被放置在一個(gè)有 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

關(guān)于 Makefile 的更多信息, GNU Make 手冊 提供了更完整的說(shuō)明和實(shí)例。


via: https://opensource.com/article/18/8/what-how-makefile

作者: Sachin Patil 選題: lujun9972 譯者: Zafiry 校對: wxy

本文由 LCTT 原創(chuàng )編譯, Linux中國 榮譽(yù)推出

點(diǎn)擊“了解更多”可訪(fǎng)問(wèn)文內鏈接

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Makefile的編寫(xiě)指導
Makefile之 =, :=, ?=
makefile變量使用及其條件判斷_Sk.小糊涂神
跟我一起寫(xiě)Makefile 6——使用條件判斷
Makefile VPATH和vpath的使用
shell特定變量和Makefile中自動(dòng)化變量的對比記憶
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久