RM新时代网站-首页

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux 下的make 工具和 Makefile

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

前言

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

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

嵌入式 Linux 入門系列博文:

嵌入式 Linux 入門(一、Linux 基本介紹及文件結(jié)構(gòu))

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

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

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

嵌入式 Linux 入門(五、Shell 腳本編程上:認(rèn)識(shí) Shell 腳本)

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

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

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

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

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

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

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

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

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

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

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

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

我是矜辰所致,全網(wǎng)同名,盡量用心寫好每一系列文章,不浮夸,不將就,認(rèn)真對(duì)待學(xué)知識(shí)的我們,矜辰所致,金石為開!

一、Linux 下多文件編譯

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

gcc [目標(biāo)文件] -o [想要生產(chǎn)的文件名字]

那在遇到多個(gè) .c 文件的時(shí)候如何處理呢?

實(shí)際上還是使用上面這條指令,其中的 [目標(biāo)文件] 是可以為多個(gè)的。

舉一個(gè)簡單的例子,我們寫了三個(gè).c 文件,內(nèi)容如下:

圖片

編譯的方式如下圖:

圖片

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

我們要考慮2個(gè)主要問題:

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

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

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

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

圖片

那么在 Linux 下,我們?cè)撊绾翁幚砟兀?/p>

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

二、make 工具和 Makefile

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

這部分的內(nèi)容時(shí)基本概念,類似名詞解釋,大家記住就好,沒有什么特別需要說明的,因?yàn)槲覀兊闹攸c(diǎn)在于知道以及學(xué)會(huì)他們的使用.

2.1 make 和 Makefile 是什么?

make 工具:

make 本質(zhì)上它是一個(gè)程序,是一個(gè)編譯工具。我們?cè)诤竺孢M(jìn)行程序的時(shí)候,都需要使用 make 命令。

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

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

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

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

Makefile 文件:

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

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

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

在 Makefile 文件中:

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

這是我們學(xué)習(xí) Linux 的一個(gè)重點(diǎn)對(duì)象,對(duì)于新手來說,至少要做到能夠看得懂,會(huì)一定程度的修改 Makefile 。

2.2 通過 STM32 提前熟悉 Makefile

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

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

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

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

圖片

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

圖片

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

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

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

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

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

圖片

因?yàn)槲覀冊(cè)?linux 下使用的都是 gcc 編譯器,所以 Makefile 中的會(huì)看到我們熟悉的 gcc 的操作命令,我們只不過是利用 make 工具的自動(dòng)編譯去調(diào)用了 gcc 編譯器 對(duì)工程進(jìn)行編譯。

三、一個(gè)簡單的 Makefile

上面說過,Makefile 是學(xué)習(xí) Linux 的一個(gè)要點(diǎn)之一,對(duì)于 Makefile 說明,我會(huì)單獨(dú)分專欄進(jìn)行說明介紹,那本文我們剛剛接觸,我們寫一個(gè)簡單的 Makefile 來編譯文章開頭我們示例的3個(gè)文件。

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

圖片

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

圖片

OK,果然可以 make 直接編譯,但是上面這個(gè) Makefile 是有問題的,因?yàn)槊看螆?zhí)行 make ,會(huì)把所有的 .c 文件都重新編譯器一次,實(shí)際使用也不可能這么寫。

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

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

圖片

make 的結(jié)果如下:

圖片

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

圖片

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

結(jié)語

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

當(dāng)然,我們的重點(diǎn)在于 Makefile,對(duì)于 Makefile 的寫法規(guī)則,更多的內(nèi)容我會(huì)單獨(dú)寫文章說明的。

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

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

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209327
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3614

    瀏覽量

    93686
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1623

    瀏覽量

    49108
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linuxautomake應(yīng)用

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

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

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

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

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

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

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

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

    make,然后報(bào)錯(cuò)了, 因?yàn)槲覜]有告訴 make 這個(gè)工具它按照什么規(guī)則來編譯我們的程序。 如下圖所示。2 Makefile文件Makefile
    發(fā)表于 12-07 11:03

    嵌入式Linux開發(fā)工具-gcc、gdb、make學(xué)習(xí)目標(biāo)

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

    關(guān)于Linux 2.6內(nèi)核Makefile的分析

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

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

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

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

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

    Linux使用autoconf和automake生成Makefile

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

    Linux的GNU Make中文手冊(cè)資料免費(fèi)下載

    Linux 環(huán)境的程序員如果不會(huì)使用 GNU make 來構(gòu)建和管理自己的工程,應(yīng)該不能算是一個(gè)合格的專業(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>中文手冊(cè)資料免費(fèi)下載

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

    的的局限性。因?yàn)閃INDOWS并沒有MAKE,造成我們所寫的MAKEFILE沒法被識(shí)別,想要在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é)

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

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

    嵌入式Linux開發(fā)工具一、嵌入式Linux開發(fā)工具-gdb、make學(xué)習(xí)目標(biāo):了解gdb學(xué)習(xí)目標(biāo):編寫
    發(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>工程管理
    RM新时代网站-首页