0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux 下的make 工具和 Makefile

科技綠洲 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2023-06-22 10:45 ? 次閱讀

前言

Linux 系列距離上一篇文章已經半年多了,因為各種事情一直耽擱到現(xiàn)在,很多小伙伴都問了好些次,一直在等著,感謝大家支持!確實時間拖得太久了,是時候重新加油起來!

簡單理了理思路,通過一篇簡單點的文章過度一下,上一篇講到了 Linux 下的 C 編程,本文就要引出 Make 以及 Makefile 了。

嵌入式 Linux 入門系列博文:

嵌入式 Linux 入門(一、Linux 基本介紹及文件結構)

嵌入式 Linux 入門(二、Linux 文件系統(tǒng)、文件類型及權限管理

嵌入式 Linux 入門(三、Linux Shell 及常用命令說明)

嵌入式 Linux 入門(四、Linux 下的編輯器 — 讓人愛恨交加的 vi )

嵌入式 Linux 入門(五、Shell 腳本編程上:認識 Shell 腳本)

嵌入式 Linux 入門(六、Shell 腳本編程下:Shell 腳本語法)

嵌入式 Linux 入門(七、Linux 下的環(huán)境變量)

嵌入式 Linux 入門(八、Linux 下的軟件安裝)

嵌入式 Linux 入門(九、Linux 下的磁盤管理)

嵌入式 Linux 入門(十、Linux 下的 C 編程)

嵌入式 Linux 入門 環(huán)境篇系列博文:

嵌入式 Linux 入門 環(huán)境篇(一、開發(fā)板初體驗)

嵌入式 Linux 入門 環(huán)境篇(二、安裝虛擬機 — 體驗 Ubuntu 22.04)

嵌入式 Linux 入門 環(huán)境篇(三、開發(fā)板和 PC 的網絡互通)

嵌入式 Linux 入門 環(huán)境篇(四、必備開發(fā)工具安裝)

嵌入式 Linux 入門 環(huán)境篇(五、NFS 文件共享)

嵌入式 Linux 入門 環(huán)境篇(六、搭建 TFTP 環(huán)境)

我是矜辰所致,全網同名,盡量用心寫好每一系列文章,不浮夸,不將就,認真對待學知識的我們,矜辰所致,金石為開!

一、Linux 下多文件編譯

在上一篇 Linux 下的 C 編程我們知道了 Linux 下的編譯器為 GCC ,以及如何使用 GCC 進行編譯,在文章我們講解 GCC 的編譯,使用的只使用了一個 .c 文件,直接使用

gcc [目標文件] -o [想要生產的文件名字]

那在遇到多個 .c 文件的時候如何處理呢?

實際上還是使用上面這條指令,其中的 [目標文件] 是可以為多個的。

舉一個簡單的例子,我們寫了三個.c 文件,內容如下:

圖片

編譯的方式如下圖:

圖片

這么看起來是不是感覺還算簡單?但是我們可以試想一下,以后做項目的時候,成千上萬個文件,怎么辦?

我們要考慮2個主要問題:

1、 文件數(shù)量多起來了以后如何處理?

2、只修改了單個文件,如何只重新編譯修改過后的單個文件?

我們不可能和上面示例一樣手動使用 gcc 命令輸入文件名的,而且文件多起來了,編譯時間需要很長,使用上面示例的命令,是會把所有的文件都重新編譯,在后面的 linux 學習開發(fā)中,項目的編譯時間可比學習 51 、STM32 哪些工程的時候多得太多,每次都編譯所有文件這種行為肯定是不可取的。

在 Windows 下面我們有各種集成的 IDE 工具,往往只需要一個按鈕,就可以編譯整個工程,方便快捷,比如我們熟悉的 Keil,我們只需要點擊 IDE 工具欄目的一個按鈕,就可以完成我們想要的操作:

圖片

那么在 Linux 下,我們該如何處理呢?

這就要用到本文主要說明的東西:Make 工具 和 Makefile 。

二、make 工具和 Makefile

首先我們要知道什么是 Make 工具,以及 什么 是 Makefile。

這部分的內容時基本概念,類似名詞解釋,大家記住就好,沒有什么特別需要說明的,因為我們的重點在于知道以及學會他們的使用.

2.1 make 和 Makefile 是什么?

make 工具:

make 本質上它是一個程序,是一個編譯工具。我們在后面進行程序的時候,都需要使用 make 命令。

使用 make 工具我們可以自動完成編譯工作,而且可以有效的處理我們上面提到的問題:

  1. 多個文件的自動編譯;
  2. 每次執(zhí)行 make 命令,只重新編譯修改后的文件;. 這里提一句,Linux 是如何判斷文件是否有修改:文件的修改時間!就是通過 ls -l 查看的那個時間,make 會根據(jù)依賴關系,如果發(fā)現(xiàn)依賴的文件修改時間比自己新,那么久會重新編譯一下這個依賴文件)

利用 make 工具可以將大型的開發(fā)項目分解成為多個更易于管理的模塊,可以簡潔明快地理順各個源文件之間紛繁復雜的相互關系,大大簡化開發(fā)工作,避免不必要的重新編譯 。

make工具通過一個稱為 Makefile 的文件來完成并自動維護編譯工作,Makefile文件描述了整個工程的編譯、連接規(guī)則。

Makefile 文件:

Makefile 是一個文件,是一個描述一系列規(guī)則的文件。

Makefile 的 開頭 M 要大寫?。m然有的地方說大小寫都可以,但是保證大寫,是肯定不會有莫名其妙的問題的)。

make 會根據(jù) Makefile 文件的規(guī)則規(guī)則執(zhí)行命令,最后完成編譯輸出 。

在 Makefile 文件中:

  • 定義一系列的規(guī)則來制定源文件編譯后的先后順序
  • 特定的語法規(guī)則、支持函數(shù)定義、函數(shù)調用
  • 能直接集成操作系統(tǒng)中的命令

這是我們學習 Linux 的一個重點對象,對于新手來說,至少要做到能夠看得懂,會一定程度的修改 Makefile 。

2.2 通過 STM32 提前熟悉 Makefile

實際上 STM32 的開發(fā),我們也可以用到 Make 工具和 Makefile,如果大家目前也在用 STM32 開發(fā),不妨使用 GCC 工具鏈開發(fā),這樣也能提前熟悉 Makefile 。

如果是我的粉絲朋友,一定知道現(xiàn)在我做 STM32 都是使用的 gcc 工具鏈,具體可查看文章:

拋棄IDE — 在window下使用VScode搭建ARM開發(fā)環(huán)境

如果想看看簡單的 Makefile ,大家可以寫一個簡單的 STM32 工程,然后在 STM32CubeMX 生成工程的時候選擇 Makefile ,如下圖:

圖片

然后打開工程,就可以看看 ST 工具自動生成的 Makefile 文件了,可以讓自己提前熟悉熟悉 Makefile:

圖片

2.3 GCC 與 make 的關系/區(qū)別?

經常有小伙伴會被 GCC 與 make 工具搞得糊里糊涂,雖然知道怎么用,但是傻傻分不清楚或者是說不明白。

看清楚概念:GCC 是編譯器,make 是一個命令工具。

感覺把概念一說就清楚了啊, GCC 是一個編譯 C語言的編譯器, 而 make 是一個工具,他可以使得編譯工作簡化,只不過我們使用的時候 make 會調用 GCC 編譯器去完成編譯工作。

在 Makefile 中我們會指定執(zhí)行編譯的編譯器類型,而且會根據(jù)指定的編譯器類型進行對應的命令操作,如下圖:

圖片

因為我們在 linux 下使用的都是 gcc 編譯器,所以 Makefile 中的會看到我們熟悉的 gcc 的操作命令,我們只不過是利用 make 工具的自動編譯去調用了 gcc 編譯器 對工程進行編譯。

三、一個簡單的 Makefile

上面說過,Makefile 是學習 Linux 的一個要點之一,對于 Makefile 說明,我會單獨分專欄進行說明介紹,那本文我們剛剛接觸,我們寫一個簡單的 Makefile 來編譯文章開頭我們示例的3個文件。

直接先寫一個傻瓜式的,看看 make 工具是否有用,在示例 .c 文件同目錄下,我們新建一個 Makefile 文件,如下:

圖片

然后試著使用 make 命令看看效果:

圖片

OK,果然可以 make 直接編譯,但是上面這個 Makefile 是有問題的,因為每次執(zhí)行 make ,會把所有的 .c 文件都重新編譯器一次,實際使用也不可能這么寫。

我們回憶一下上一篇課程的內容,一個C 文件要經過預處理、編譯、匯編 和 鏈接才能變成可執(zhí)行文件,由不同的 .c 文件生成到不同的 .o 文件,最終才將所有的 .o 文件鏈接成可執(zhí)行文件。

所以我們可分開進行,把每一個 .c 先生成 .o 文件,然后再由 所有的 .o 文件生成 最終的文件,這樣如果單獨修改了某個文件 ,只需要把修改過的 .c 文件重新編譯就行了,所以我們的 Makefile 應該這么寫:

圖片

make 的結果如下:

圖片

這樣寫得好處就是,如果我們只對某一個.c 文件進行修改,他只會對修改過的文件進行重新編譯,我們可以測試一下,比如我們修改一下 a.c 文件:

圖片

上面這個簡單的 Makefile ,大家是不是已經可以感覺到 make 工具的方便快捷了!

結語

本文向大家介紹了一下 Linux 編程時候使用的 make 工具,如何在沒有 IDE 工具的 Linux 環(huán)境下高效快捷的編譯工程,就靠 make 工具了。

當然,我們的重點在于 Makefile,對于 Makefile 的寫法規(guī)則,更多的內容我會單獨寫文章說明的。

對于入門的小伙伴來說,也沒有必要一蹴而就,寫好 Makefile 固然重要,但是對于現(xiàn)在一般的應用開發(fā)來說,Makefile 要完全自己從頭寫得時候不多,很多時候可以找到一個可用的模板進行修改,我們至少要做到可以看懂,可以去修改 Makefile!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209518
  • 編程
    +關注

    關注

    88

    文章

    3616

    瀏覽量

    93738
  • 編譯器
    +關注

    關注

    1

    文章

    1634

    瀏覽量

    49133
收藏 人收藏

    評論

    相關推薦

    Linuxautomake應用

    linux 環(huán)境,當項目工程很大的時候,編譯的過程很復雜,所以需要使用 make 工具,自動進行編譯安裝,但是手寫 makefile 文件
    的頭像 發(fā)表于 08-24 15:10 ?2755次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>automake應用

    #硬聲創(chuàng)作季 #LinuxLinux-1.16 make工具Makefile的引入-1

    LinuxMakefile
    水管工
    發(fā)布于 :2022年11月10日 17:19:02

    #硬聲創(chuàng)作季 #LinuxLinux-1.16 make工具Makefile的引入-2

    LinuxMakefile
    水管工
    發(fā)布于 :2022年11月10日 17:19:22

    使用嵌入式Linux開發(fā)工具多文件Makefile的編寫

    #上節(jié)課回顧:嵌入式Linux開發(fā)工具:-gcc 、gdb、make學習目標:了解gdb;編寫makefile (.c --.o) – Linux
    發(fā)表于 11-05 08:48

    迅為龍芯2K1000開發(fā)板Linux工具make工具Makefile文件

    make,然后報錯了, 因為我沒有告訴 make 這個工具它按照什么規(guī)則來編譯我們的程序。 如下圖所示。2 Makefile文件Makefile
    發(fā)表于 12-07 11:03

    嵌入式Linux開發(fā)工具-gcc、gdb、make學習目標

    嵌入式系統(tǒng)課堂小結3.24嵌入式Linux開發(fā)工具-gcc、gdb、make學習目標:了解gdb學習目標:編寫makefile(.c–.o)–Lin
    發(fā)表于 12-22 07:55

    關于Linux 2.6內核Makefile的分析

    Linux在公司的推廣起到一定的推動作用,算是拋磚引玉吧! 1 Makefile組織層次 LinuxMake體系由如下幾部
    發(fā)表于 11-02 10:12 ?1次下載

    淺談Linux/Unix環(huán)境make命令解析

    無論是在Linux還是在Unix環(huán)境中,make都是一個非常重要的編譯命令。不管是自己進行項目開發(fā)還是安裝應用軟件,我們都經常要用到makemake install。利用
    發(fā)表于 11-07 10:50 ?0次下載

    Linux實現(xiàn)進度條程序,通過makefile進行編譯

    1. 在Linux實現(xiàn)進度條程序。 通過makefile進行編譯。 建議自主完成一個彩色的進度條。 寫Makefile文件的原因:Makefil
    發(fā)表于 03-12 16:31 ?2118次閱讀

    Linux使用autoconf和automake生成Makefile

    ?作為Linux的程序開發(fā)人員,一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便。一般情況,大
    發(fā)表于 04-02 14:41 ?267次閱讀

    Linux的GNU Make中文手冊資料免費下載

    Linux 環(huán)境的程序員如果不會使用 GNU make 來構建和管理自己的工程,應該不能算是一個合格的專業(yè)程序員,至少不能稱得上是 Unix 程序員。在 Linux(unix)環(huán)境
    發(fā)表于 06-03 08:00 ?9次下載
    <b class='flag-5'>Linux</b>的GNU <b class='flag-5'>Make</b>中文手冊資料免費下載

    WINDOWS系統(tǒng)使用GCC+MAKE開發(fā)MCU

    的的局限性。因為WINDOWS并沒有MAKE,造成我們所寫的MAKEFILE沒法被識別,想要在WINDOWS使用MAKEFILE又必須去
    發(fā)表于 10-28 11:06 ?15次下載
    WINDOWS系統(tǒng)<b class='flag-5'>下</b>使用GCC+<b class='flag-5'>MAKE</b>開發(fā)MCU

    嵌入式Linux第五周課程總結

    #上節(jié)課回顧:嵌入式Linux開發(fā)工具:-gcc 、gdb、make學習目標:了解gdb;編寫makefile (.c --.o) – Linux
    發(fā)表于 11-02 12:06 ?8次下載
    嵌入式<b class='flag-5'>Linux</b>第五周課程總結

    課堂筆記五之嵌入式Linux開發(fā)工具

    嵌入式Linux開發(fā)工具一、嵌入式Linux開發(fā)工具-gdb、make學習目標:了解gdb學習目標:編寫
    發(fā)表于 11-02 12:36 ?11次下載
    課堂筆記五之嵌入式<b class='flag-5'>Linux</b>開發(fā)<b class='flag-5'>工具</b>

    AN033 基于Linux環(huán)境Makefile工程管理

    AN033 基于Linux環(huán)境Makefile工程管理
    發(fā)表于 02-23 19:08 ?0次下載
    AN033 基于<b class='flag-5'>Linux</b>環(huán)境<b class='flag-5'>下</b>的<b class='flag-5'>Makefile</b>工程管理