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

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

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

Makefile是如何編譯代碼文件的?

冬至子 ? 來源:MBD開發(fā) ? 作者:dingxu ? 2023-05-18 15:27 ? 次閱讀

Makefile 簡介

makefile文件最常用的作用是,告訴make程序,如何來編譯以及連接程序,最終生成可執(zhí)行的二進(jìn)制文件。

Makefile 最基礎(chǔ)的規(guī)則格式如下:

Target … : Prerequisites

Recipe

Target 是目標(biāo)文件,通常就是程序編譯最終所要產(chǎn)生的文件,比如二進(jìn)制可執(zhí)行文件,或者是obj文件

Prerequisite是先決條件,也就是生成目標(biāo)文件所需的輸入文件,一個(gè)目標(biāo)文件通常依賴于多個(gè)文件

Recipe是執(zhí)行命令??梢杂卸鄠€(gè)執(zhí)行命令,可以在同一行,也可以分成多行。特別要注意的是,每個(gè)Recipe之前都要加Tab

通常Recipe中會(huì)包含Prerequisite,并且任意一個(gè)Prerequisite文件有更改時(shí),都會(huì)重新生成Target文件

生成目標(biāo)hex文件的流程

makefile最廣泛的應(yīng)用就是把一堆代碼文件編譯成二進(jìn)制的可執(zhí)行文件,比如hex文件。

圖片

首先把所有的.c文件以及其包含的.h文件,分別都編譯為.o文件。

然后把所有生成的.o文件與link文件一起,生成.elf文件和.map文件

最后由.elf文件生成.hex文件

循序漸進(jìn)的例子

1. 首先準(zhǔn)備好編譯器和demo代碼

可以在hightec的官網(wǎng)上下載hightec的評(píng)估版軟件

然后在HighTec中新建一個(gè)HelloSerial的Demo例子

圖片

圖片

創(chuàng)建完就會(huì)自動(dòng)生成如下的.c和.h文件,這個(gè)就可以直接在Hightec中編譯了。

圖片

2. 最最直接的makefile

為了說明makefile是如何工作的,先從最簡單的情況開始說明。

首先為了消除路徑的影響,先把所有的.c和.h文件還有l(wèi)ink文件(.ld文件)都放到同一個(gè)文件夾內(nèi),然后新建一個(gè)名叫makefile的文件

圖片

下面我們看一下最最最直接的makefile長什么樣,相信在任何一個(gè)項(xiàng)目中,都不會(huì)有人這么寫makefile的,暫且叫他版本0

圖片

紅色的就是Target,所謂目標(biāo)文件。比如我們?cè)谖募A路徑下的命令窗口輸入MakeAll

圖片

就是告訴make命令,想要生成all這個(gè)目標(biāo),然后all這個(gè)目標(biāo)又依賴于HelloSerial_Demo.elf 這個(gè)Prerequisite 也就是先決條件

于是就要生成HelloSerial_Demo.elf,這時(shí),HelloSerial_Demo.elf就變成了目標(biāo)文件。

然后為了要生成HelloSerial_Demo.elf這個(gè)目標(biāo)文件,就需要hello.o,system_tc27x.o,uart_init_poll.o,uart_poll.o,usr_sprintf.o這些Prerequisite

于是這些.o文件又變成了目標(biāo)文件,需要對(duì)應(yīng)的.c文件和其中包含的.h文件來生成

比如要生成hello.o 這個(gè)文件,就需要hello.c,led.huart_poll.h,system_tc2x.h,usr_sprintf.h 這些文件,由于這些文件已經(jīng)在目錄下面了,所以就可以直接用了。

然后還需要Recipe,也就是執(zhí)行命令來生成目標(biāo)文件,這邊的執(zhí)行命令就是"C:/HIGHTEC/toolchains/tricore/v4.6.6.1/bin/tricore-gcc"-c hello.c

其中"C:/HIGHTEC/toolchains/tricore/v4.6.6.1/bin/tricore-gcc"是調(diào)用HighTec安裝的編譯器,tricore-gcc.exe

圖片

這個(gè)不是固定的,我們需要用哪個(gè)編譯器來編譯.c文件,那么這邊就調(diào)用哪個(gè)編譯器的.exe文件。

-c 表示編譯源文件,但不進(jìn)行l(wèi)ink。這條指令就是告訴tricore-gcc.exe把hello.c這個(gè)文件編譯成hello.o

類似的,把所有的.c文件都編譯為.o文件后,就會(huì)進(jìn)行l(wèi)ink的操作,生成HelloSerial_Demo.elf這個(gè)文件。具體的執(zhí)行命令如下:

"C:/HIGHTEC/toolchains/tricore/v4.6.6.1/bin/tricore-gcc" \\

-o "HelloSerial_Demo.elf" \\

-T"iROM.ld" \\

hello.o system_tc27x.o uart_init_poll.o uart_poll.ousr_sprintf.o \\

-Wl,--gc-sections -mcpu=tc27xx \\

-Wl,--no-warn-flags \\

-Wl,-Map="HelloSerial_Demo.map"

其中

"C:/HIGHTEC/toolchains/tricore/v4.6.6.1/bin/tricore-gcc" 是調(diào)用編譯器

-o "HelloSerial_Demo.elf" 是指定輸出文件的名字叫"HelloSerial_Demo.elf"

-T"iROM.ld" 是指定link文件

hello.o system_tc27x.o uart_init_poll.o uart_poll.o usr_sprintf.o 這些是要被link的.o文件

-Wl 由于這邊是通過tricore-gcc 編譯器驅(qū)動(dòng)鏈接的指令,所以對(duì)鏈接的指令需要加前綴'-Wl',

--gc-sections -mcpu=tc27xx 表示section的分配是按照 tc27xx 這個(gè)系列的cpu來執(zhí)行的

--no-warn-flags 表示不會(huì)產(chǎn)生警告信息

-Map="HelloSerial_Demo.map" 表示會(huì)生成一個(gè)map文件

""是換行符

3. makefile中的變量

在版本0中的makefile中,只用了makefile最基本的規(guī)則,這樣的makefile具體做什么,看著是挺清楚的,但寫起來很麻煩。

makefile中可以使用變量,這樣,會(huì)看起來簡單一些

比如對(duì)于版本0中的makefile,需要用到的.o文件定義了多次,編譯器的路徑也定義了多次,那我們就可以把這些做成一個(gè)變量,使用的時(shí)候就可以直接使用了。

定義變量的方法是:<變量名> = <內(nèi)容>

使用變量的方法時(shí):$(變量名)

我們把所有的.o文件對(duì)象和編譯器路徑定義為變量,得到如下的makefile版本1

圖片

4. <-I "dir">指令

對(duì)于版本1的makefile還有個(gè)問題,就是每次要編譯.c文件為.o文件時(shí),需要把這個(gè).c文件所用的.h文件,以及.h文件里用到的.h文件都要寫出來。

這樣寫當(dāng)然也有好處,就是任何.h文件有變化時(shí),包含這個(gè).h文件的.c文件也會(huì)重新編譯一個(gè)新的.o文件。

但是如果有成百上千個(gè).c文件時(shí),把所有.c文件用到的.h文件都找出來,這個(gè)工作量也是巨大的。

所以可以用一種妥協(xié)的方法,就是無論編譯哪個(gè).c文件時(shí),把所有的.h文件都包含進(jìn)來,這樣就不用管這個(gè).c文件到底用到了哪些.h文件。

想要實(shí)現(xiàn)這點(diǎn),那就可以在編譯.c文件時(shí),增加<-I "dir">這個(gè)指令

于是我們可以得到版本2的makefile,這樣看起來又簡單了一些。不過這種方法會(huì)有一個(gè)問題,就是.h文件變更時(shí),不會(huì)導(dǎo)致對(duì)應(yīng)的.c文件重新編譯

這個(gè)問題其實(shí)也是可以解決的,后面引入依賴文件時(shí),就可以 解決這個(gè)問題

圖片

相比于之前的makefile,這里生成.o文件時(shí)的先決條件中就沒有.h文件了,而是在執(zhí)行命令中添加了包含.h文件夾的參數(shù)。

  1. vpath指令

可能大家也發(fā)現(xiàn),現(xiàn)在每個(gè).c文件的編譯命令都一樣了,只有文件名不一樣,這個(gè)是不是可以優(yōu)化呢,當(dāng)然是可以的

vpath指令可以在指定的目錄下面找特定的文件,比如我要找在某個(gè)文件夾下面所有的.c文件,指令如下:

vpath %.c E:/c10_Workspace/complier_demo

這就表示需要的時(shí)候,make就會(huì)在E:/c10_Workspace/complier_demo找,看有沒有make需要的.c文件,%.c 表示所有后綴名為.c的文件

利用vpath指令,我們就可以繼續(xù)簡化makefile,得到版本2的makefile。

這里把.c編譯為.o的指令合并為一個(gè)指令了。所有需要的.o文件都可以在vpath指定的路徑中找到對(duì)應(yīng)的.c文件(這里是make的一個(gè)默認(rèn)規(guī)則,.o和.c文件的名稱是一致的),然后進(jìn)行編譯

圖片

  1. 生成依賴文件 (.d)

我們可以讓編譯器在編譯.c文件的時(shí)候,同時(shí)生成一個(gè).d的依賴文件,在依賴文件中,會(huì)列出這個(gè).c文件所包含的所有.h文件。

生成的.d文件如下,會(huì)把這個(gè).d文件作為一個(gè)Traget,Prerequisite文件就是其對(duì)應(yīng)的.c文件,以及.c文件所引用的所有頭文件。

這樣就把這個(gè).c文件所生成的.d文件和這個(gè).c文件引用的所有.h文件就關(guān)聯(lián)起來了。

圖片

當(dāng)某一個(gè).h文件有修改時(shí),引用這個(gè)頭文件的.c文件所生成的.d文件就會(huì)被認(rèn)為要重新生成,再配合上對(duì)應(yīng)生成規(guī)則,就可以保證當(dāng)某一個(gè).h文件修改時(shí),包含這個(gè).h的所有.c文件都會(huì)重新編譯。

于是就得到了版本3的makefile

圖片

首先增加了依賴文件的變量定義(DEPS),里面定義了所有的依賴文件。

其次在.c編譯為.o文件時(shí),增加了指令 -MMD -MP -MF,以及-MT。這些指令的作用都是生成.d的依賴文件,"(@:%.o=%.d)"是依賴文件的文件名,由于依賴文件和目標(biāo)的.o文件是同名,只是后綴由.o變?yōu)?d,所以這邊"(@:%.o=%.d)"的作用就是把目標(biāo).o文件的后綴改為.d,作為生成的依賴文件的文件名。

同時(shí)增加了目標(biāo)文件.d對(duì).c文件的規(guī)則,表示.d文件如果需要重新生成的話,就會(huì)按照這個(gè)規(guī)則,把.c文件重新編譯一份.o文件。由于這邊目標(biāo)文件就是.d文件,所以這里就直接使用了"$@"來指定生成.d文件的名稱。

最后增加了include的指令,把所有的生成的依賴文件都包含進(jìn)來。include的作用就是把include的文件里的內(nèi)容直接加到當(dāng)前的makefile中。也就是增加.d文件和對(duì)應(yīng).c文件和.h文件的規(guī)則。保證了當(dāng).h文件被修改時(shí),對(duì)應(yīng)的.d也會(huì)被要求重新生成,從而去重新編譯對(duì)應(yīng)的.c文件,生成新的.o文件。

  1. 通過定義代碼文件夾,自動(dòng)推導(dǎo)出編譯所需的文件

通過之前的步驟,一個(gè)功能比較完善的makefile就寫完了。但還有一個(gè)問題,目前所有的.c和.h文件都在一個(gè)文件夾內(nèi),而且生成的.o和.d文件也都在同一個(gè)文件夾,這樣很不利于管理。

我們把文件夾路徑調(diào)整的跟實(shí)際更為貼切一些,如下圖所示,.c分件分別在5個(gè)不同source_code的文件夾中,.h文件分別在6個(gè)不同的include_file中,makefile和link文件在complie_env中,編譯完產(chǎn)生的map文件和elf文件,也在complie_env中,同時(shí)在編譯時(shí),complie_env中還會(huì)生成一個(gè)臨時(shí)文件夾tmp,用來存放.o和.d文件。

圖片

同時(shí),手動(dòng)定義.o文件和.d文件也很麻煩,我們也可以直接從給定的文件夾中尋找所有的.c文件,然后根據(jù)文件夾的相對(duì)路徑推導(dǎo)出.o和.d文件

于是就有了版本4的makefile

圖片

首先定義存放臨時(shí)文件(.d和.o文件)的文件夾,makefile中都推薦使用相對(duì)路徑,這樣不管工程放在什么路徑下面,只要文件夾結(jié)構(gòu)不變就都能正常運(yùn)行。"./"表示makefile當(dāng)前文件夾的路徑。

然后定義包含所有需要參與編譯的.c文件的文件夾,這些文件里所有的.c文件都會(huì)參與編譯,"../"表示makefile當(dāng)前文件夾的上一層文件夾路徑。

接著定義所有被引用的.h文件的文件夾。

再接著根據(jù)定義的.c文件的文件夾,找出這些文件夾里所有的.c文件。這里有兩個(gè)指令可以解釋一下,一個(gè)是 foreach,"foreach DIR, **(SRC_DIRS), **(wildcard (DIR)/*.c)"表示對(duì)SRC_DIRS中定義的所有文件夾做一個(gè)for循環(huán),當(dāng)前循環(huán)的文件夾名叫DIR。另一個(gè)是wildcard,"(wildcard $(DIR)/*.c"表示找到DIR這個(gè)文件夾下面所有的.c文件。這樣就把SRC_DIRS中定義的所有的文件夾里所有的.c文件都找出來了,給到SRCS這個(gè)變量中。

有了所有.c文件后,就可以推導(dǎo)出所有的.o文件,由于.o文件的位置和.c文件不一樣,所以具體推導(dǎo).o文件的步驟就是將.c文件的文件夾路徑去掉,只保留.c文件的文件名,然后加上將要存放.o文件的路徑,以及把.c的后綴換成.o。這一些列的動(dòng)作,都可以用"OBJS = **(patsubst %.c, {TMP_DIR}/%.o,(notdir **{SRCS}))"這個(gè)命令來實(shí)現(xiàn)。"nodir"就是去掉文件夾路徑,"patsubst"是替換指令,這里是把所有.c文件替換為.o文件,并加上路徑。

最后就是根據(jù).o文件定義.d依賴文件,由于.d文件和.o文件都會(huì)放在臨時(shí)文件夾中,所以只要簡單的將.o文件的后綴.o換成.d就可以了。

由于.o文件和.d文件的位置發(fā)生了變化,執(zhí)行語句的命令也要做修改,.o和.d的目標(biāo)文件都加了路徑,命令中也加了"-o",明確指定了編譯后的.o文件存放的位置。

  1. 將makefile按功能分類

現(xiàn)在可以看到,由于加了代碼文件夾和頭文件文件夾的定義,makefile文件變長了不少,如果是大型項(xiàng)目,那么代碼文件夾和頭文件夾的數(shù)目會(huì)更多。為了更好的維護(hù)makefile,我們可以按照功能多定義幾個(gè)makefile,然后在主makefile中include這些makefile,這樣使得層次更加清晰,也更好維護(hù)。

比如可以新建一個(gè)source.mk的文件,里面定義想要生成的二進(jìn)制文件的名稱,c代碼文件夾,頭文件文件夾,臨時(shí)文件夾,推導(dǎo)出所有的.c,.o,.d文件

圖片

還可以再建一個(gè)congif.mk的文件,里面定義跟編譯器相關(guān)的一些設(shè)置,比如編譯器的路徑,刪除命令的定義,編譯時(shí)的參數(shù)等

圖片

這樣我們的主makefile又變得簡潔了,而且這個(gè)文件基本就可以不用修改了。如果編譯設(shè)置要修改的話,就修改config.mk,如果需要編譯代碼的內(nèi)容有修改的話,就去修改source.mk。維護(hù)起來就很清晰了,美滋滋~

圖片

  1. 刪除編譯產(chǎn)生的文件

我們有時(shí)不但需要編譯文件,也需要?jiǎng)h除之前編譯的文件,這個(gè)也可以在makefile中完成。

我們可以添加clean功能,在clean為目標(biāo)的情況下,執(zhí)行刪除命令,刪除.o文件,.d文件,elf文件和map文件

圖片

這邊介紹一下PHONY功能,因?yàn)閍ll和clean作為Target時(shí),這兩個(gè)命令并不是真正的文件名,也就是并不是要生成名為all或者clean的文件。但是萬一有文件名叫all或者clean的文件話,就會(huì)產(chǎn)生歧義,這時(shí)就可以用.PHONY來定義all和clean,告訴make,這兩個(gè)是命令,而不是文件,防止發(fā)生其想不到的問題。

另外,由于執(zhí)行clean命令時(shí),僅僅是想刪除文件,并不需要去推導(dǎo)依賴文件,所以這邊使用ifneq來判斷,如果命令是clean的話,就不包含依賴文件了。

同時(shí),也增加了rebuild功能,如果執(zhí)行make rebuild的話,就會(huì)先clean,刪除之前的文件,然后再生成目標(biāo)文件。

  1. 調(diào)用makefile

如果makefile的名字就叫makefile或Makefile,那么可以在cmd的命令框中,將路徑切換到makefile的路徑,直接輸入make all,進(jìn)行編譯,或者make clean,刪除之前編譯的文件。

但makefile的名字也不一定非要這么叫,我們可以任意起名字,調(diào)用的時(shí)候只要增加參數(shù) "-f" 然后加上文件名就可以了,比如:

make -f makefile_ver5 all,或者make -f makefile_ver5 clean

另外,還有一個(gè)參數(shù)比較使用的就是"-j"加數(shù)字,比如

make all -j8

數(shù)字可以根據(jù)自己電腦cpu的線程數(shù)進(jìn)行調(diào)整,這個(gè)表示可以多個(gè)線程并行處理命令,也就是可以同時(shí)編譯多個(gè).c文件,這樣可以提高編譯速度。

另外如果嫌每次要打開cmd窗口比較麻煩的話,也可以建一個(gè)build.bat的批處理文件,這樣想要編譯時(shí),就直接雙擊這個(gè)文件就可以了。

Cmd /k的作用是運(yùn)行完仍然保留cmd窗口,這樣如果有錯(cuò)誤的話就能看到了。

build.bat文件的內(nèi)容如下:

圖片

后記

這篇文將主要是介紹makefile的規(guī)則和大概的運(yùn)行原理,知道這些之后,大家可以根據(jù)實(shí)際需要來自己寫makefile,或者把之前項(xiàng)目中的makefile按自己的理解優(yōu)化。

關(guān)于make的參數(shù)和詳細(xì)說明可以參考"make.pdf",關(guān)于編譯器的參數(shù)詳細(xì)說明可以參考“tricore-gcc.pdf”,關(guān)于鏈接的參數(shù)詳細(xì)說明,可以參考“tricore-ld.pdf”。這些都在百度網(wǎng)盤里,代碼和makefile也在里面。感興趣的可以下下來看看。或者根據(jù)項(xiàng)目實(shí)際的情況查閱對(duì)應(yīng)的make,編譯和link的對(duì)應(yīng)文檔。

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

    關(guān)注

    6037

    文章

    44558

    瀏覽量

    635355
  • HEX文件
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

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

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49133
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19184
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Makefile】C文件包含的頭文件修改,但不重新編譯

    【Linux + MakefileMakefile的高階用法:解決C文件包含的頭文件修改了,但C文件不重新
    的頭像 發(fā)表于 09-08 08:53 ?5411次閱讀
    【<b class='flag-5'>Makefile</b>】C<b class='flag-5'>文件</b>包含的頭<b class='flag-5'>文件</b>修改,但不重新<b class='flag-5'>編譯</b>?

    淺談Linux內(nèi)核源碼的Makefile、Kconfig和.config文件

    Linux內(nèi)核源碼文件繁多,搞不清Makefile、Kconfig、.config間的關(guān)系,不了解內(nèi)核編譯體系,編譯修改內(nèi)核有問題無從下手,自己寫的驅(qū)動(dòng)不知道怎么編進(jìn)內(nèi)核,不知道怎么配
    發(fā)表于 10-17 16:19 ?4206次閱讀
    淺談Linux內(nèi)核源碼的<b class='flag-5'>Makefile</b>、Kconfig和.config<b class='flag-5'>文件</b>

    如何寫Makefile編譯匯編和C文件

    經(jīng)常在一個(gè)項(xiàng)目中包含多個(gè).c源文件,而且一個(gè).c源文件包含了一堆的頭文件,這種情況下如何編寫makefile,使得能成功編譯整個(gè)項(xiàng)目?本博文
    發(fā)表于 11-24 09:03 ?1.4w次閱讀
    如何寫<b class='flag-5'>Makefile</b><b class='flag-5'>編譯</b>匯編和C<b class='flag-5'>文件</b>

    windows平臺(tái)下makefile操作教程

    Makefile一個(gè)工程中的源文件不計(jì)其數(shù),其按類型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯
    發(fā)表于 11-24 17:14 ?1.2w次閱讀
    windows平臺(tái)下<b class='flag-5'>makefile</b>操作教程

    在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 ?2118次閱讀

    Linux0.11-Makefile 文件

    這個(gè) Makefile 文件的主要作用是指示 make 程序最終使用獨(dú)立編譯連接成的 tools/目錄中的 build 執(zhí)行程序?qū)⑺袃?nèi)核編譯代碼
    發(fā)表于 05-15 14:30 ?637次閱讀
    Linux0.11-<b class='flag-5'>Makefile</b> <b class='flag-5'>文件</b>

    虛擬機(jī):Linux的Makefile使用for編譯多個(gè)目標(biāo)文件

    假如,有很多文件,每個(gè)文件都要變成一個(gè)單獨(dú)的目標(biāo)文件,如果使用makefile的話,最好能用一個(gè) for 循環(huán)來做。
    的頭像 發(fā)表于 06-22 17:40 ?4662次閱讀
    虛擬機(jī):Linux的<b class='flag-5'>Makefile</b>使用for<b class='flag-5'>編譯</b>多個(gè)目標(biāo)<b class='flag-5'>文件</b>

    Linux內(nèi)核的Makefile、Kconfig和.config文件

    Linux內(nèi)核源碼文件繁多,搞不清Makefile、Kconfig、.config間的關(guān)系,不了解內(nèi)核編譯體系,編譯修改內(nèi)核有問題無從下手,自己寫的驅(qū)動(dòng)不知道怎么編進(jìn)內(nèi)核,不知道怎么配
    的頭像 發(fā)表于 11-12 17:31 ?3055次閱讀

    ARM代碼編譯鏈接的工作流程

    編譯過程編譯過程就是把源代碼編譯生成目標(biāo)代碼的過程。而采用ARM編譯命令,可以將源
    的頭像 發(fā)表于 12-22 16:57 ?2158次閱讀

    芯片設(shè)計(jì)中的Makefile簡單教程

    Makefile可以根據(jù)指定的依賴規(guī)則和文件是否有修改來執(zhí)行命令。常用來編譯軟件源代碼,只需要重新編譯修改過的
    的頭像 發(fā)表于 12-24 17:41 ?951次閱讀

    一個(gè)STM32編譯Makefile模板

    一個(gè)STM32編譯Makefile模板
    發(fā)表于 11-13 20:06 ?10次下載
    一個(gè)STM32<b class='flag-5'>編譯</b><b class='flag-5'>Makefile</b>模板

    交叉編譯鏈下的Makefile(STM32F4xx)

    文章圍繞makefile文件的編寫方式,向讀者講述如何在ubuntu平臺(tái)上用交叉編譯鏈 arm-none-eabi- 編譯出 STM32F4xx 系列 MCU 的執(zhí)行
    發(fā)表于 12-04 12:36 ?7次下載
    交叉<b class='flag-5'>編譯</b>鏈下的<b class='flag-5'>Makefile</b>(STM32F4xx)

    什么是Makefile?

    如果您有多個(gè) c、c++ 和其他語言的文件,并且想通過終端命令編譯它們,我們?cè)撊绾?b class='flag-5'>編譯他們呢?為了解決這類問題,Makefile就出現(xiàn)了。
    的頭像 發(fā)表于 02-17 10:41 ?4583次閱讀
    什么是<b class='flag-5'>Makefile</b>?

    Makefile文件的編寫規(guī)則及實(shí)例

    Makefile帶來直接好處就是——“自動(dòng)化編譯”。一旦寫好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,所以十分方便。而Makefile文件
    的頭像 發(fā)表于 05-19 14:52 ?3585次閱讀

    Makefile可以做什么?Makefile的基本格式

    Makefile可以根據(jù)指定的依賴規(guī)則和文件是否有修改來執(zhí)行命令。常用來編譯軟件源代碼,只需要重新編譯修改過的
    的頭像 發(fā)表于 01-25 11:18 ?706次閱讀