網站首頁 編程語言 正文
make介紹
借助Makefile
我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數,可以極大簡化項目編譯過程。
make
是一個構建自動化工具,會在當前目錄下尋找Makefile
或makefile
文件。如果存在相應的文件,它就會依據其中定義好的規則完成構建任務。
Makefile介紹
我們可以把Makefile
簡單理解為它定義了一個項目文件的編譯規則。借助Makefile
我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數,可以極大簡化項目編譯過程。同時使用Makefile
也可以在項目中確定具體的編譯規則和流程,很多開源項目中都會定義Makefile
文件。
本文不會詳細介紹Makefile
的各種規則,只會給出Go項目中常用的Makefile
示例。
Makefile文件教程解析
我們教程主要是講的是 Makefile 。很多 Linux(Unix) 做開發的初學者不了解 Makefile 是什么,甚至大部分 Windows 開發工程師對 Makefile 都特別陌生。這個其實很正常,如果你是在 Windows 下作開發的話不需要去考慮這個問題,因為 Windows 下的集成開發環境(IDE)已經內置了 Makefile,或者說會自動生成 Makefile,我們不用去手動編寫。
Linux 中卻不能這樣,需要我們去手動的完成這項工作。Linux 下可以學習的開發語言有很多,常見的有 C/C++語言、python、java 等等。如果你想要在 Linux(Unix) 下做開發的話,不了解 Makefile 是一件非常失敗的事情,甚至說你就成為不了一個合格的 Linux 開發工程師。不懂 Makefile,就操作不了多文件編程,就完成不了相對于大的工程項目的操作。如果你想在 Linux(Unix) 環境下做開發的話,Makefile 是必須掌握的一項技能。
那么,究竟什么是 Makefile 呢?
Makefile 可以簡單的認為是一個工程文件的編譯規則,描述了整個工程的編譯和鏈接等規則。其中包含了那些文件需要編譯,那些文件不需要編譯,那些文件需要先編譯,那些文件需要后編譯,那些文件需要重建等等。
編譯整個工程需要涉及到的,在 Makefile 中都可以進行描述。換句話說,Makefile 可以使得我們的項目工程的編譯變得自動化,不需要每次都手動輸入一堆源文件和參數。
以 Linux 下的C語言開發為例來具體說明一下,多文件編譯生成一個文件,編譯的命令如下所示:
gcc -o outfile name1.c name2.c ...
outfile 要生成的可執行程序的名字,nameN.c 是源文件的名字。這是我們在 Linux 下使用 gcc 編譯器編譯 C 文件的例子。如果我們遇到的源文件的數量不是很多的話,可以選擇這樣的編譯方式。如果源文件非常的多的話,就會遇到下面的這些問題。
1) 編譯的時候需要鏈接庫的的問題。拿C語言來說,編譯的時候 gcc 只會默認鏈接一些基本的C語言標準庫,很多源文件依賴的標準庫都需要我們手動鏈接。
下面列舉了一些需要我們手動鏈接的標準庫:
- name1.c 用到了數學計算庫 math 中的函數,我們得手動添加參數 -Im;
- name4.c 用到了小型數據庫 SQLite 中的函數,我們得手動添加參數 -lsqlite3;
- name5.c 使用到了線程,我們需要去手動添加參數 -lpthread。
因為有很多的文件,還要去鏈接很多的第三方庫。所以在編譯的時候命令會很長,并且在編譯的時候我們可能會涉及到文件鏈接的順序問題,所以手動編譯會很麻煩。
如果我們學會使用 Makefile 就不一樣了,它會徹底簡化編譯的操作。把要鏈接的庫文件放在 Makefile 中,制定相應的規則和對應的鏈接順序。這樣只需要執行 make 命令,工程就會自動編譯。每次想要編譯工程的時候就執行 make ,省略掉手動編譯中的參數選項和命令,非常的方便。
2) 編譯大的工程會花費很長的時間。
如果我們去做項目開發,免不了要去修改工程項目的源文件,每次修改后都要去重新編譯。一個大的工程項目可不止有幾個的源文件,里面的源文件個數可能有成百上千個。例如一個內核,或者是一個軟件的源碼包。這些都是我們做開發經常會遇到的。要完成這樣的文件的編譯,我們消耗的時間可不是一點點。如果文件特別大的話我們可能要花上半天的時間。
對于這樣的問題我們 Makefile 可以解決嗎?當然是可以的,Makefile 支持多線程并發操作,會極大的縮短我們的編譯時間,并且當我們修改了源文件之后,編譯整個工程的時候,make 命令只會編譯我們修改過的文件,沒有修改的文件不用重新編譯,也極大的解決了我們耗費時間的問題。
這其實是我們遇到的比較常見的問題,當然可能遇到的問題還會有很多,比如:工程文件中的源文件的類型很多,編譯的話需要選擇的編譯器;文件可能會分布在不同的目錄中,使用時需要調價路徑。這些問題都可以通過 Makefile 解決。并且文件中的 Makefile 只需要完成一次,一般我們只要不增加或者是刪除工程中的文件,Makefile 基本上不用去修改,編譯時只用一個 make 命令。為我們提供了極大的便利,很大程度上提高編譯的效率。
規則概述
Makefile
由多條規則組成,每條規則主要由兩個部分組成,分別是依賴的關系和執行的命令。
其結構如下所示:
[target] ... : [prerequisites] ... <tab>[command] ... ...
其中:
targets
:規則的目標
prerequisites
:可選的要生成 targets 需要的文件或者是目標。
command
:make 需要執行的命令(任意的 shell 命令)。可以有多條命令,每一條命令占一行。
舉個例子:
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'"
原文鏈接:https://www.cnblogs.com/guyouyin123/p/14577354.html
相關推薦
- 2022-04-07 C語言的線性表之順序表你了解嗎_C 語言
- 2022-11-25 Go實現快速生成固定長度的隨機字符串_Golang
- 2022-04-23 uniapp封裝本地存儲處理數據的方法和具體使用
- 2022-06-23 Pandas中常用的七個時間戳處理函數使用總結_python
- 2023-03-16 Redis設置key的過期時間_Redis
- 2022-11-09 PostgreSQL?HOT與PHOT有哪些區別_PostgreSQL
- 2022-07-19 Eureka注冊中心之搭建eureka-server
- 2023-01-01 利用Python腳本實現傳遞參數的三種方式分享_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支