最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go項目編寫Makefile規(guī)則文件概述

 更新時間:2022年04月16日 13:50:52   作者:Jeff的技術(shù)棧  
這篇文章主要為大家介紹了Go項目編寫Makefile文件規(guī)則概述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

make介紹

借助Makefile我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數(shù),可以極大簡化項目編譯過程。

make是一個構(gòu)建自動化工具,會在當前目錄下尋找Makefilemakefile文件。如果存在相應的文件,它就會依據(jù)其中定義好的規(guī)則完成構(gòu)建任務。

Makefile介紹

我們可以把Makefile簡單理解為它定義了一個項目文件的編譯規(guī)則。借助Makefile我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數(shù),可以極大簡化項目編譯過程。同時使用Makefile也可以在項目中確定具體的編譯規(guī)則和流程,很多開源項目中都會定義Makefile文件。

本文不會詳細介紹Makefile的各種規(guī)則,只會給出Go項目中常用的Makefile示例。

Makefile文件教程解析

我們教程主要是講的是 Makefile 。很多 Linux(Unix) 做開發(fā)的初學者不了解 Makefile 是什么,甚至大部分 Windows 開發(fā)工程師對 Makefile 都特別陌生。這個其實很正常,如果你是在 Windows 下作開發(fā)的話不需要去考慮這個問題,因為 Windows 下的集成開發(fā)環(huán)境(IDE)已經(jīng)內(nèi)置了 Makefile,或者說會自動生成 Makefile,我們不用去手動編寫。

Linux 中卻不能這樣,需要我們?nèi)ナ謩拥耐瓿蛇@項工作。Linux 下可以學習的開發(fā)語言有很多,常見的有 C/C++語言、python、java 等等。如果你想要在 Linux(Unix) 下做開發(fā)的話,不了解 Makefile 是一件非常失敗的事情,甚至說你就成為不了一個合格的 Linux 開發(fā)工程師。不懂 Makefile,就操作不了多文件編程,就完成不了相對于大的工程項目的操作。如果你想在 Linux(Unix) 環(huán)境下做開發(fā)的話,Makefile 是必須掌握的一項技能。

那么,究竟什么是 Makefile 呢?

Makefile 可以簡單的認為是一個工程文件的編譯規(guī)則,描述了整個工程的編譯和鏈接等規(guī)則。其中包含了那些文件需要編譯,那些文件不需要編譯,那些文件需要先編譯,那些文件需要后編譯,那些文件需要重建等等。

編譯整個工程需要涉及到的,在 Makefile 中都可以進行描述。換句話說,Makefile 可以使得我們的項目工程的編譯變得自動化,不需要每次都手動輸入一堆源文件和參數(shù)。

以 Linux 下的C語言開發(fā)為例來具體說明一下,多文件編譯生成一個文件,編譯的命令如下所示:

gcc -o outfile name1.c name2.c ...

outfile 要生成的可執(zhí)行程序的名字,nameN.c 是源文件的名字。這是我們在 Linux 下使用 gcc 編譯器編譯 C 文件的例子。如果我們遇到的源文件的數(shù)量不是很多的話,可以選擇這樣的編譯方式。如果源文件非常的多的話,就會遇到下面的這些問題。

1) 編譯的時候需要鏈接庫的的問題。拿C語言來說,編譯的時候 gcc 只會默認鏈接一些基本的C語言標準庫,很多源文件依賴的標準庫都需要我們手動鏈接。

下面列舉了一些需要我們手動鏈接的標準庫:

  • name1.c 用到了數(shù)學計算庫 math 中的函數(shù),我們得手動添加參數(shù) -Im;
  • name4.c 用到了小型數(shù)據(jù)庫 SQLite 中的函數(shù),我們得手動添加參數(shù) -lsqlite3;
  • name5.c 使用到了線程,我們需要去手動添加參數(shù) -lpthread。

因為有很多的文件,還要去鏈接很多的第三方庫。所以在編譯的時候命令會很長,并且在編譯的時候我們可能會涉及到文件鏈接的順序問題,所以手動編譯會很麻煩。

如果我們學會使用 Makefile 就不一樣了,它會徹底簡化編譯的操作。把要鏈接的庫文件放在 Makefile 中,制定相應的規(guī)則和對應的鏈接順序。這樣只需要執(zhí)行 make 命令,工程就會自動編譯。每次想要編譯工程的時候就執(zhí)行 make ,省略掉手動編譯中的參數(shù)選項和命令,非常的方便。

2) 編譯大的工程會花費很長的時間。

如果我們?nèi)プ鲰椖块_發(fā),免不了要去修改工程項目的源文件,每次修改后都要去重新編譯。一個大的工程項目可不止有幾個的源文件,里面的源文件個數(shù)可能有成百上千個。例如一個內(nèi)核,或者是一個軟件的源碼包。這些都是我們做開發(fā)經(jīng)常會遇到的。要完成這樣的文件的編譯,我們消耗的時間可不是一點點。如果文件特別大的話我們可能要花上半天的時間。

對于這樣的問題我們 Makefile 可以解決嗎?當然是可以的,Makefile 支持多線程并發(fā)操作,會極大的縮短我們的編譯時間,并且當我們修改了源文件之后,編譯整個工程的時候,make 命令只會編譯我們修改過的文件,沒有修改的文件不用重新編譯,也極大的解決了我們耗費時間的問題。

這其實是我們遇到的比較常見的問題,當然可能遇到的問題還會有很多,比如:工程文件中的源文件的類型很多,編譯的話需要選擇的編譯器;文件可能會分布在不同的目錄中,使用時需要調(diào)價路徑。這些問題都可以通過 Makefile 解決。并且文件中的 Makefile 只需要完成一次,一般我們只要不增加或者是刪除工程中的文件,Makefile 基本上不用去修改,編譯時只用一個 make 命令。為我們提供了極大的便利,很大程度上提高編譯的效率。

規(guī)則概述

Makefile由多條規(guī)則組成,每條規(guī)則主要由兩個部分組成,分別是依賴的關(guān)系和執(zhí)行的命令。

其結(jié)構(gòu)如下所示:

[target] ... : [prerequisites] ...
<tab>[command]
    ...
    ...

其中:

targets:規(guī)則的目標

prerequisites:可選的要生成 targets 需要的文件或者是目標。

command:make 需要執(zhí)行的命令(任意的 shell 命令)??梢杂卸鄺l命令,每一條命令占一行。

舉個例子:

build:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o xx

示例

.PHONY: all build run gotool clean help
BINARY="bluebell"
all: gotool build
build:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ${BINARY}
run:
	@go run ./
gotool:
	go fmt ./
	go vet ./
clean:
	@if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi
help:
	@echo "make - 格式化 Go 代碼, 并編譯生成二進制文件"
	@echo "make build - 編譯 Go 代碼, 生成二進制文件"
	@echo "make run - 直接運行 Go 代碼"
	@echo "make clean - 移除二進制文件和 vim swap files"
	@echo "make gotool - 運行 Go 工具 'fmt' and 'vet'"

以上就是Go項目編寫Makefile規(guī)則概述的詳細內(nèi)容,更多關(guān)于Go項目編寫Makefile規(guī)則的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文秒懂Go 編寫命令行工具的代碼

    一文秒懂Go 編寫命令行工具的代碼

    這篇文章主要介紹了一文秒懂Go 編寫命令行工具的代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 解決Go語言數(shù)據(jù)庫中null值的問題

    解決Go語言數(shù)據(jù)庫中null值的問題

    這篇文章主要介紹了解決Go語言數(shù)據(jù)庫中null值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • goFrame的隊列g(shù)queue對比channel使用詳解

    goFrame的隊列g(shù)queue對比channel使用詳解

    這篇文章主要為大家介紹了goFrame的gqueue對比channel使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • gRPC的發(fā)布訂閱模式及REST接口和超時控制

    gRPC的發(fā)布訂閱模式及REST接口和超時控制

    這篇文章主要為大家介紹了gRPC的發(fā)布訂閱模式及REST接口和超時控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • golang通過gorm操作sqlite設(shè)置主鍵自增的步驟

    golang通過gorm操作sqlite設(shè)置主鍵自增的步驟

    這篇文章主要介紹了golang通過gorm操作sqlite設(shè)置主鍵自增的詳細步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Go語言panic和recover的用法實例

    Go語言panic和recover的用法實例

    panic()和recover()是Go語言中用于處理錯誤的兩個重要函數(shù),本文主要介紹了Go語言panic和recover的用法實例,panic()用于中止程序并引發(fā)panic,而recover()用于捕獲panic并恢復程序的執(zhí)行,感興趣的可以了解一下
    2024-01-01
  • Golang map實現(xiàn)原理深入分析

    Golang map實現(xiàn)原理深入分析

    map是一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關(guān)于golang中map使用的幾點注意事項,需要的朋友可以參考下
    2023-01-01
  • 以Golang為例詳解AST抽象語法樹的原理與實現(xiàn)

    以Golang為例詳解AST抽象語法樹的原理與實現(xiàn)

    AST?使用樹狀結(jié)構(gòu)來表達編程語言的結(jié)構(gòu),樹中的每一個節(jié)點都表示源碼中的一個結(jié)構(gòu),本文將以GO語言為例,為大家介紹一下AST抽象語法樹的原理與實現(xiàn),希望對大家有所幫助
    2024-01-01
  • golang API開發(fā)過程的中的自動重啟方式(基于gin框架)

    golang API開發(fā)過程的中的自動重啟方式(基于gin框架)

    這篇文章主要介紹了golang API開發(fā)過程的中的自動重啟方式(基于gin框架),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Go中的fuzz模糊測試使用實戰(zhàn)詳解

    Go中的fuzz模糊測試使用實戰(zhàn)詳解

    這篇文章主要為大家介紹了Go中的fuzz模糊測試使用實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論

育儿| 庆元县| 花莲县| 沁阳市| 沭阳县| 云霄县| 晋江市| 宕昌县| 历史| 方城县| 思南县| 永德县| 信丰县| 贵南县| 两当县| 寻乌县| 马山县| 内丘县| 柏乡县| 墨竹工卡县| 永仁县| 原阳县| 通城县| 清涧县| 高州市| 遂川县| 宣城市| 乐平市| 瓦房店市| 霍林郭勒市| 晋江市| 扎囊县| 尤溪县| 安塞县| 扎鲁特旗| 衢州市| 会同县| 吉林省| 广安市| 连江县| 台前县|