chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-09-08 08:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在上一篇 《【Linux + Makefile】十分鐘教你學(xué)會(huì)Makefile的FORCE》文章的最后,筆者就FORCE的用法在一個(gè)示例工程中使用,提出了一個(gè)問(wèn)題:為何build_info.h每次都是新生成的(有修改過(guò)),而main.c又是有include “build-info.h”,但main.c卻不是每次都重新編譯呢?這個(gè)到底是不是違反了Makefile的基本規(guī)則呢?本文將給你答案,通過(guò)閱讀本文,你將了解到以下內(nèi)容:

  • 如何保證在C文件中包含的頭文件修改了的時(shí)候,C文件每次都會(huì)被重新編譯?

為了更好地展示上訴描述的問(wèn)題,我們將之前的示例工程稍微復(fù)雜化一點(diǎn)點(diǎn):

整個(gè)工程有3個(gè).c文件,a.c/b.c/main.c,其中main.c會(huì)調(diào)用a.c/b.c中的兩個(gè)接口,同時(shí)main.c會(huì)include頭文件build_info.h;這個(gè)build_info.h每次編譯都會(huì)重新生成,按照我們之前的寫法,我們Makefile可能就是這樣:

SHELL           = /bin/bash #指定shell使用/bin/bash,否則echo -e可能會(huì)出問(wèn)題
ECHO            = echo
BIN             = test
BUILG_INFO_H    = build_info.h
SRC-C-y         += a.c
SRC-C-y         += b.c
SRC-C-y         += main.c
SRC-O           = $(patsubst %.c, $(O)%.o, $(SRC-C-y))

all: gen_build_info $(BIN)

clean: 
    rm -rf $(SRC-O) $(BIN) $(BUILG_INFO_H)

$(BIN) : $(SRC-O)
    gcc -o $(O)"$@" $(SRC-O)
	
%.o : %.c
    gcc -c "$<" -o "$@"
	
gen_build_info: $(BUILG_INFO_H)

$(BUILG_INFO_H): FORCE     #強(qiáng)制生成build_info.h
    @$(RM) $@
    @$(ECHO) '  GEN     $@'
    @$(ECHO) -e   " #ifndef __BUILD_INFO_H__\n"\
				"#define __BUILD_INFO_H__\n"\
				"#define APP_TIME        	\"`date "+%Y-%m-%d %H:%M:%S"`\"\n"\
				"#endif"  > $@

FORCE:
.PHONY: FORCE
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

執(zhí)行make,我們會(huì)發(fā)現(xiàn),跟我們的預(yù)期不一樣:它雖然會(huì)每次都生成build_info.h,但是main.c包含了build_info.h卻不會(huì)每次都重新編譯。這個(gè)問(wèn)題發(fā)生的原因,我們來(lái)分析下:

在我們的Makefile規(guī)則中,main.o只依賴于main.c (Makefile 第18-19行),而在第二次執(zhí)行make的時(shí)候,main.c顯然并沒(méi)有被修改,所以main.o不會(huì)重新生成,自然可執(zhí)行文件就不會(huì)重新生成。這里的問(wèn)題根源在于,main.c它是依賴于build_info.h的,而這個(gè)依賴關(guān)系并沒(méi)有體現(xiàn)在Makefile中,所以整個(gè)編譯流程達(dá)不到我們的預(yù)期想法。我們嘗試下,將main.c的依賴頭文件也寫入到Makefile中,怎么實(shí)現(xiàn)呢?

恰好,GCC給了我們強(qiáng)大的支持,它有個(gè)非常有用的選項(xiàng) -MD -MF,它可以在生成一個(gè).o的同時(shí)也生成它的依賴文件列表,修改后的Makefile如下所示:

SHELL           = /bin/bash #指定shell使用/bin/bash,否則echo -e可能會(huì)出問(wèn)題
ECHO            = echo
BIN             = test
BUILG_INFO_H    = build_info.h
SRC-C-y         += a.c
SRC-C-y         += b.c
SRC-C-y         += main.c
SRC-O           = $(patsubst %.c, $(O)%.o, $(SRC-C-y))
SRC-C-DEPS      = $(patsubst %.c, $(O).%.o.d, $(SRC-C-y))  ## 由 a.c ==> .a.o.d

all: gen_build_info $(BIN)

clean: 
    rm -rf $(SRC-O) $(BIN) $(BUILG_INFO_H) $(SRC-C-DEPS)

$(BIN) : $(SRC-O)
    gcc -o $(O)"$@" $(SRC-O)
	
%.o : %.c
#	生成xxx.o的時(shí)候,同時(shí)生成它的依賴列表,放在文件.xxx.o.d中
	gcc -c "$<" -o "$@" -MD -MF "$(dir $@).$(notdir $@).d" -MT "$@"
	
gen_build_info: $(BUILG_INFO_H)

$(BUILG_INFO_H): FORCE     #強(qiáng)制生成build_info.h
    @$(RM) $@
    @$(ECHO) '  GEN     $@'
    @$(ECHO) -e   " #ifndef __BUILD_INFO_H__\n"\
				"#define __BUILD_INFO_H__\n"\
				"#define APP_TIME        	\"`date "+%Y-%m-%d %H:%M:%S"`\"\n"\
				"#endif"  > $@

FORCE:
.PHONY: FORCE

# 在Makefile末尾強(qiáng)制包含這些依賴文件
-include $(SRC-C-DEPS)

測(cè)試結(jié)果如下所示:

再次執(zhí)行make,多試幾次,一樣的結(jié)果。

由上可知,經(jīng)過(guò)改造后的Makefile是實(shí)現(xiàn)了我們的需求,每次build_info.h重新生成,導(dǎo)致main.c包含了build_info.h也會(huì)重新編譯,而a.c和b.c沒(méi)有被修改,所以在未執(zhí)行make clean的情況下,a.c和b.c是不會(huì)被重新編譯的,每次都是僅僅main.c被再次編譯,從而重新生成新的test可執(zhí)行文件。這樣就是已經(jīng)達(dá)到了【當(dāng)C文件包含的頭文件修改了的時(shí)候,C文件必須重新編譯】的目的。


以上就是關(guān)于Makefile的高階用法,基本滿足了我們?nèi)粘9こ虒?shí)踐的需求。如果你對(duì)該Makefile有疑問(wèn),歡迎在評(píng)論席提出你的疑問(wèn),博主很樂(lè)意為你解答。


延伸閱讀:

【Linux + Makefile】十分鐘教你學(xué)會(huì)Makefile的FORCE

?審核編輯:湯梓紅

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

    關(guān)注

    88

    文章

    11622

    瀏覽量

    217818
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    20188
  • C文件
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    3215
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用Vivado 2018.2編譯E203的mcs文件,遇到的問(wèn)題求解

    Hi 各位,我在嘗試使用Vivado 2018.2編譯E203的mcs文件,遇到如下兩個(gè)問(wèn)題: 1. 按照書中步驟運(yùn)行,執(zhí)行完make mcs之后得到的mcs文件與git中預(yù)編譯出來(lái)的
    發(fā)表于 11-11 06:04

    蜂鳥hbird sdk的Makefile架構(gòu)分析

    Makefile文件之間的關(guān)系和主要功能. 二.內(nèi)容 ?以application/helloworld 為例進(jìn)行分析,首先編寫完成main.c文件之后,我們會(huì)在helloworld
    發(fā)表于 10-30 07:15

    頭文件保護(hù)失效,提示變量重復(fù)包含,是什么原因?qū)е碌模?/a>

    我自定了一個(gè)頭文件,而且使用了頭文件保護(hù)機(jī)制。但是在兩個(gè)源文件包含相同的頭文件時(shí),依然提示某些變量重復(fù)
    發(fā)表于 10-09 06:19

    修改Kconfig的配置后,編譯基本等于重新編譯一遍,怎么解決?

    RT-Thread的配置選項(xiàng)會(huì)輸出到rtconfig.h文件中,一旦這個(gè)文件發(fā)生改變,編譯的時(shí)候,需要重新編譯的內(nèi)容是非常多的. 有沒(méi)有辦法進(jìn)行優(yōu)化呢?我只
    發(fā)表于 09-28 11:17

    menuconfig修改不使能lvgl后無(wú)法編譯怎么解決?

    先使用menuconfig配置了啟用lvgl 然后變異成功,運(yùn)行也成功。 通過(guò)menuconfig關(guān)閉lvgl 重新編譯失敗了, 提示找不到lvgl相關(guān)頭文件。我明明已經(jīng)關(guān)閉了為啥還會(huì)有引用呢?
    發(fā)表于 09-24 07:41

    RTT如何添加文件夾并加入編譯

    想把一個(gè)新的工程文件夾(包含若干個(gè)源文件頭文件)放入同一個(gè)工程內(nèi)編譯。 試了下把在文件系統(tǒng)添加
    發(fā)表于 09-15 07:50

    飛凌嵌入式ElfBoard ELF 1板卡-uboot編譯原理介紹

    編譯工具將源碼文件編譯成可執(zhí)行文件的過(guò)程并不是一步到位的,其中要經(jīng)過(guò)一個(gè)類似工廠流水線的過(guò)程,交叉編譯工具中
    發(fā)表于 05-22 11:17

    cypress3014在頭文件修改編譯后,時(shí)間不變,這樣頭文件的程序有被執(zhí)行嗎?

    你好,請(qǐng)問(wèn)我在頭文件修改編譯后,時(shí)間不變,這樣頭文件的程序有被執(zhí)行嗎,怎么解決這個(gè)問(wèn)題
    發(fā)表于 05-14 06:50

    迅為RK3568開發(fā)板內(nèi)核模塊實(shí)現(xiàn)-編寫 Makefile

    編譯驅(qū)動(dòng)程序還需要使用 Makefile 文件。我們?yōu)?helloworld.c 編寫一個(gè)簡(jiǎn)單的 Makefile,
    發(fā)表于 04-24 13:36

    redefinition of \'gImage_pic2\'

    重新編譯,避免舊緩存導(dǎo)致錯(cuò)誤?58。 ?驗(yàn)證步驟? 確認(rèn) pic2.h 已添加頭文件保護(hù)。 檢查 gImage_pic2 僅在 ?單個(gè)源文件? 中定義。 重新編譯工程,觀察錯(cuò)誤是否消
    發(fā)表于 04-01 11:55

    STM32使用ISp燒錄HEX文件運(yùn)行,代碼重新編譯之后的產(chǎn)生的新hex文件選擇全片擦除就沒(méi)辦法正常運(yùn)行,為什么?

    我有一套代碼需要使用ISp燒錄HEX文件運(yùn)行,代碼有一個(gè)老的HEX,無(wú)論是全片擦除還是擦除重要部分再下載都沒(méi)有問(wèn)題。但是代碼重新編譯之后的產(chǎn)生的新hex文件,如果選擇全片擦除,就沒(méi)辦法正常運(yùn)行。只有
    發(fā)表于 03-10 07:42

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹之Makefile修改

    不同而新增加了dts,則需要在這個(gè)Makefile的這個(gè)位置添加上對(duì)應(yīng)的.dtb文件名參與編譯。ELF 1使用的設(shè)備樹命名為imx6ull-elf1-emmc.dts,是基于NXP官方evk板子的設(shè)備樹imx6ull-14x14
    發(fā)表于 01-13 09:09

    飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹之Makefile修改

    不同而新增加了dts,則需要在這個(gè)Makefile的這個(gè)位置添加上對(duì)應(yīng)的.dtb文件名參與編譯。ELF 1使用的設(shè)備樹命名為imx6ull-elf1-emmc.dts,是基于NXP官方evk板子的設(shè)備樹imx6ull-14x14
    發(fā)表于 01-10 09:23

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之Makefile介紹

    文件的目標(biāo)文件進(jìn)行重新編譯更新,這就大大減少了編譯時(shí)間。打開源碼目錄可以看到,Makefile文件
    發(fā)表于 01-04 10:40

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之Makefile介紹

    文件的目標(biāo)文件進(jìn)行重新編譯更新,這就大大減少了編譯時(shí)間。 打開源碼目錄可以看到,Makefile文件
    發(fā)表于 01-03 09:39