1. 程式人生 > >makefile專題:自動生成依賴關係(續)

makefile專題:自動生成依賴關係(續)


.PHONY : all clean rebuild

MKDIR := mkdir
RM := rm -rf
CC := gcc

DIR_DEPS := deps
DIR_EXES := exes
DIR_OBJS := objs

DIRS := $(DIR_DEPS) $(DIR_EXES) $(DIR_OBJS)

EXE := app.out
EXE := $(addprefix $(DIR_EXES)/, $(EXE))

SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)
OBJS := $(addprefix $(DIR_OBJS)/, $(
OBJS)) DEPS := $(SRCS:.c=.dep) DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS)) all : $(DIR_OBJS) $(DIR_EXES) $(EXE) ifeq ("$(MAKECMDGOALS)", "all") -include $(DEPS) endif ifeq ("$(MAKECMDGOALS)", "") -include $(DEPS) endif $(EXE) : $(OBJS) $(CC) -o [email protected] $^ @echo "SUCCESS!!! Target => $(EXE)"
$(DIR_OBJS)/%.o : %.c $(CC) -o [email protected] -c $(filter %.c, $^) $(DIRS) : $(MKDIR) [email protected] ifeq ("$(wildcard $(DIR_DEPS))", "") $(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c else $(DIR_DEPS)/%.dep : %.c endif @echo "Creating [email protected] ..." @set -e; \ $(
CC) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o [email protected] : ,g' > [email protected] clean : $(RM) $(DIRS) rebuild : @$(MAKE) clean @$(MAKE) all
注意事項:當.dep檔案生成後,如果動態的改變標頭檔案間的依賴關係,那麼make可能無法檢測到這個改變,進而做出錯誤的編譯決策
解決方案:
  • 將依賴檔名作為目標加入自動生成的依賴關係中
  • 通過include載入依賴檔案時判斷是否執行規則
  • 在規則執行時重新生成依賴關係檔案
  • 最後載入新的依賴檔案

小結

  • makefile中可以將目標的依賴拆分寫到不同的地方
  • include關鍵字能夠觸發相應的規則的執行
  • 如果規則的執行導致依賴更新,可能導致再次解釋執行相應規則
  • 依賴檔案也需要依賴於原始檔得到正確的編譯決策
  • 自動生成檔案間的依賴關係能夠提高makefile的移植性

宣告:此文章為本人在學習狄泰軟體學院《十二月提升計劃》所做的筆記,參考書籍《專業嵌入式軟體開發》——李雲,文章中包含狄泰軟體資料內容和《專業嵌入式軟體開發》資料內容,一切版權歸狄泰軟體《專業嵌入式軟體開發》所有!

相關推薦

makefile專題自動生成依賴關係

.PHONY : all clean rebuild MKDIR := mkdir RM := rm -rf CC := gcc DIR_DEPS := deps DIR_EXES := exes

makefile自動生成依賴關係

手工編寫依賴關係不僅工作量大而且極易出現遺漏,更新也很難及時,修改源或標頭檔案後makefile可能忘記修改。為了解決這個問題,可以用gcc的-M選項自動生成目標檔案和原始檔的依賴關係。-M選項會把包含的系統標頭檔案以及其所包含的其他系統標頭檔案也找出來了,如果我們不需要

makefile(05)_自動生成依賴關系

makefile 自動生成依賴 include 11.自動生成依賴關系_上 11.0. 實驗原料 本節實驗所需的源文件和頭文件:原文件:func.c #include "stdio.h" #include "func.h" void foo() { printf("void foo() :

Intellij IDEA中使用MyBatis-generator自動生成MyBatis程式碼Oracle

原文地址:http://blog.csdn.net/z69183787/article/details/46560071   Intellij IDEA 14 作為JavaIDE 神器,接觸後發現,非常好用,對它愛不釋手,打算離開eclipse和myeclipse,投入Intell

自動生成日報表

d1.py ______________________________________________ #-*-coding:utf-8-*- import time import datetime filename='record20180911.txt' x1,x

IL2CPP 深入講解程式碼生成之旅

IL2CPP 深入講解:程式碼生成之旅 IL2CPP INTERNALS: A TOUR OF GENERATED CODE 這是IL2CPP深入講解系列的第二篇博文。在這篇文章中,我們會對由il2cpp產生的C++程式碼進行分析。我們會看到託管程式碼中的類在C++中如何

ubuntu下安裝包依賴關係問題& apt包管理工具解決方法

用到ubuntu時難免要安裝千奇百怪包以用於資料的處理與解釋,之前都是有通過#sudo apt-get install,或是通過自行下載之後#sudo dpkg -i 檔名 進行安裝。可是,對於這兩者到底是幹什麼的,還有為什麼包有依賴關係是一直一臉矇蔽的,今天看了幾位大神的帖

【暴力自動生成排列】2015第六屆藍橋杯省賽 C/C++ B組 題解第三題

第三題題目三羊獻瑞觀察下面的加法算式:       祥 瑞 生 輝  +   三 羊 獻 瑞-------------------   三 羊 生 瑞 氣(如果有對齊問題,可以參看【圖1.jpg】)其中

springcloud自動生成腳手架搭建

完成之後的前臺頁面展示: 測試地址 :dota2info.cn/index                 1.配置pom.xml <dependency> <groupId>org.springframework.b

深入理解MyBatis的原理配置文件用法

pac amt 單個 gis obb rri tab obj 用戶 前言:前文講解了 MyBatis 的配置文件一部分用法,本文將繼續講解 MyBatis 的配置文件的用法。 目錄 1、typeHandler 類型處理器 2、ObjectFactory 3、插件 4、e

自動生成依賴關系

png CM 之前 out HA def 打印 card 期望 我們在之前的 makefile 學習中,其目標文件(.o)只依賴於源文件(.c)。那麽如果在源文件中還包含有頭文件,此時編譯器如何編譯源文件和頭文件呢?我們來看看編譯行為帶來的缺陷:1、預處理器

webpack4系列教程自動生成專案中的HTML檔案

傳送門: webpack4系列教程(一):初識webpack webpack4系列教程(二):建立專案,打包第一個JS檔案   1. webpack中的CommonJS和ES Mudule 規範 1.1 CommonJs規範 CommonJs規範的出發點:JS沒

Makefile自動生成依賴檔案,並自動編譯

因為經常要用到makefile編譯,每次都為標頭檔案的依賴關係頭痛,所以這次費了兩天時間開發了一個通用的makefile,它可以自動生成依賴檔案,並編譯,當然你要按檔案裡面的說明來填充一些中間檔名. 程式碼如下: #自動依賴項(*.d),並編譯生成檔案 #編譯選項 LDF

一份通用makefile,自動遍歷子目錄原始檔,自動生成依賴

這份makefile可以將當前makefile所在資料夾以及所有子資料夾中的cpp檔案打包成靜態庫/動態庫/可執行檔案. 自動生成所有依賴關係,修改任何檔案都可以觸發重新編譯相應依賴的檔案。 在U

makefile 自動生成依賴檔案

gcc  -c -o a.o a.c -Wp, -MD a.d a.d就是生成的依賴檔案 在a.d中 有 a.o:a.c a.h  (以及其他依賴的標頭檔案等) 在makefile中,包含依賴檔案,使用依賴檔案,使用如下: include a.d %.o : %.c$(CC

makefile自動產生依賴關係

我們在編譯原始碼的時候,有時候會發現當我們修改某個.h檔案,make之後並沒有發生任何變化,大家是不是很困惑,命名修改了.h檔案為什麼不編譯呢,其實我們的.h不是依賴檔案,什麼意思?納尼?不是依賴檔案。。。我想告訴大家的是,是的,確實是的。 那問題來了,怎麼把我們的make

makefile自動生成依賴

Makefile中,可能需要書寫一些規則來描述一個.o目標檔案和標頭檔案的依賴關係.例如,如果在main.c中使用"#include defs.h",那麼我們可能需要如下那樣的一個規則來描述當頭檔案"defs.h"被修改以後執行make,目標"main.o"應該被重建.

ROS知識16----如何編譯時自動鏈接同一個工作空間的其他包的頭文件包含message,srv,action自動生成的頭文件

logs package fin 空間 依賴庫 osc div build 知識 catkin_make編譯時,往往需要自動鏈接同一個工作空間的其他包的頭文件。否則會出現類似如下的錯誤: /home/xx/xx_ws/srcA_package/src/db.hpp:13:

綜合示例自動生成一組新聞

lap func tel style display ima one closed alt 點擊按鈕,自動生成5條新聞信息 用一組數組把5條新聞保存起來, 再運用 if 判讀和 for 循環來達到自動生成的效果 1 <!DOCTYPE HTML> 2

自動生成小學生四則運算C語言

.html .com 它的 百度 http htm log hub .cn 我寫的這個自動生成小學生四則運算的代碼是根據我在百度上看到的一篇博客改的,地址為http://www.cnblogs.com/ys1101/p/4368103.html。它的功能不夠完整,只有整數的