1. 程式人生 > >makefile 可以自動推導生成.o規則

makefile 可以自動推導生成.o規則



CC      = gcc
 CPP     = g++
 RM      = rm -rf

## debug flag
 DBG_ENABLE   = 0

## source file path
 SRC_PATH   := .

## target exec file name
 TARGET     := exe

## get all source files
 SRCS         += $(wildcard $(SRC_PATH)/*.cpp)

## all .o based on all .c
 OBJS        := $(SRCS:.cpp=.o)


 ## need libs, add at here
 LIBS :=

## used headers  file path
 INCLUDE_PATH := ./

## used include librarys file path
 LIBRARY_PATH := /lib

## debug for debug info, when use gdb to debug
 ifeq (1, ${DBG_ENABLE})
     CFLAGS += -D_DEBUG -O0 -g -DDEBUG=1
 endif

## get all include path
 CFLAGS  += $(foreach dir, $(INCLUDE_PATH), -I$(dir))

## get all library path
 LDFLAGS += $(foreach lib, $(LIBRARY_PATH), -L$(lib))

## get all librarys
 LDFLAGS += $(foreach lib, $(LIBS), -l$(lib))

 
build:$(OBJS)
# $(CPP) -c $(CFLAGS) $(SRCS)
 $(CPP) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)


#可自動推導.o檔案生成規則 
 
sinclude $(SRCS:.cpp=.d)

%d: %cpp
 @echo "create depend"
 $(CPP) -MM $(CFLAGS) $< >

[email protected]$$$$; \
 sed 's,\($*\)\.o[ :]*,\1.o [email protected] ,g' < [email protected]$$$$ > [email protected]; \
 $(RM) [email protected]$$$$
   
#$(OBJS):$(SRCS)
# $(CPP) -c $(CFLAGS) $(SRCS)
 
clean:
 $(RM) $(OBJS) $(TARGET)

    sinclude $(SOURCES:.c=.d)
    %d: %c
          @echo "create depend"
          $(CC) -MM $(CFLAGS) $< > [email protected]$$$$; \
          sed 's,\($*\)\.o[ :]*,\1.o [email protected] ,g' < [email protected]$$$$ > [email protected]; \
          $(RM) [email protected]$$$$

 sinclude $(SOURCES:.c=.d) 這一行是非常關鍵的,它在當前Makefile裡去include另外的Makefile. 這裡“另外”的Makefile是將SOURCES變數裡所有.c替換成.d。 在我的例子裡就是dList.d memory.d test.d debug.d. 意思就是執行到這裡
    的時候先去依次執行dList.d memory.d test.d debug.d. 這裡的.d檔案就是包含了每個.c檔案自動生成的對標頭檔案的依賴關係。這個依賴關係將由下面的%d:%c來完成。
   
    %d: %c
    此規則的含義是:所有的.d檔案依賴於同名的.c檔案。
第一行;使用c編譯器自自動生成依賴檔案($<)的標頭檔案的依賴關係,並輸出成為一個臨時檔案,“$$$$”表示當前程序號。如果$(CC)為GNU的c編譯工具,產生的依賴關係的規則中,依賴標頭檔案包括了所有的使用的系統標頭檔案和使用者定義的標頭檔案。如果需要生成的依賴描述檔案不包含系統標頭檔案,可使用“-MM”代替“-M”。
第二行;使用sed處理第二行已產生的那個臨時檔案並生成此規則的目標檔案。經過這一行後test.d裡內容如下:test.o: test.c aaron.h dList.h debug.h 其他.d裡以此類推。
第三行;刪除臨時檔案。

    到這裡基本的意義弄明白了,但是讓我不解的是%d: %c這個依賴的規則怎麼能被執行到的?按照我的理解Makefile在執行時首先檢查終極目標main是否存在,如果不存在則建立(根據main的依賴規則),如果存在在需要檢視
    main的依賴檔案是否存在並且是最新的,這我的例子裡就是要看test.o dList.o memory.o debug.o是否存在且最新。這樣追下去是否沒有%d: %c什麼事啊, .d檔案也應該不存在或者說是空的。儘管我們include了.d檔案,但是沒有依賴規則去執行它啊。後來仔細閱讀了
    Makefile檔案的重建才明白了。
    Makefile如果由其它檔案重建(這裡我的Makefile include了所有.d檔案,.d也可以看成是一個Makefile),Makefile在讀入所有其他makefile檔案(.d)之後,首先將所讀取的每個makefile(.d)作為一個目標,尋找更新它們的規則。同樣
    如果此目標不存在則根據依賴規則重新建立。在例子裡其實.d檔案開始並不存在,所以當Makefile在include這些.d檔案時首先看.d存在不,不存在就要去尋找.d的依賴檔案和規則。這裡就找到了%d: %c從而創建出真正的.d檔案。其實這裡的關鍵點就是對於
    include了理解,它是把include的檔案首先當成一個目標,然後要去尋找其依賴檔案和規則的,而不是我事先想象的簡單的把其他檔案的內容包含過來。
    到此,問題解決,基本達到預期。

相關推薦

makefile 可以自動推導生成.o規則

 CC      = gcc  CPP     = g++  RM      = rm -rf ## debug flag  DBG_ENABLE   = 0 ## source file path  SRC_PATH   := . ## target exec fil

makefile 自動推導的坑-檔案更新

    有 a.c, makefile 兩個檔案,使用自動推導如下makefile:objs = a.o all: $(objs)     gcc -o all $(objs) .PHONY: clean clean: rm all $(objs) 第一次 make

讓我們來嚼makefile: 自動推導功能

目的: 明白自動推導功能能幹什麼事。 場景: 當前目錄下有兩個檔案 main.c和makefile; 其中main.c內容如下: #include #include int main(int argc, char** argv) { printf

makefile自動依賴生成

自動依賴生成 基於make的構建環境要正確工作, 一個很重要(也很煩人)的任務是, 在makefile中正確列 舉依賴. 這個文件將介紹了一個非常有用的讓make自身來建立和維護這些依賴的方法. 文章來源 所有的make程式都需要知道, 某個特定的target依賴的檔案有哪些, 以便確認它(target) 會

使用mybatis自動生成指定規則的編號

一、要求 1.如果表中還未有選單,新增一級選單,編號為:'300' 2.繼續新增一級選單,編號為:一級選單最大編號 + 1,如'301','302','303' 3.新增子級選單:編號 = 父級編號 + 當前父級選單下最大選單編號 +1,如果當前子級沒有選單則從001開始  如:'300001','30

makefile 自動生成標頭檔案依賴關係

在使用makefile 自動生成標頭檔案依賴是,大家多半使用了下面這個方法。 這個sed語句被稱之為 "上帝的符號",可讀性不言而喻。(PS:CSDN這個排版怎麼也搞不好,只能用圖片了。) gcc的 -MMD 選項可以自動生成帶有依賴規則的.d檔案,為建立標頭檔案依賴帶來

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

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

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

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

一個能自動搜尋原始檔並自動推導Makefile

今天看了一天的makefile的寫法,東拼西湊,好不容易寫出了一個makefile,頗有成就感,記錄下來,以備溫習之用。 假設有兩個標頭檔案目錄 header1,header2;兩個cpp檔案目錄,src1,src2,一個lib目錄 寫一個完整的makefile步驟如下:

makefile自動生成依賴性

在Makefile中,我們的依賴關係可能會需要包含一系列的標頭檔案,比如,如果我們的main.c中有一句“#include "defs.h"”,那麼我們的依賴關係應該是: main.o : main.c defs.h 但是,如果是一個比較大型的工程,你必需清楚哪些C檔

Makefile自動生成工具-----autotools的使用(詳細)

  相信每個學習Linux的人都知道Makefile,這是一個很有用的東西,但是編寫它是比較複雜,今天介紹一個它的自動生成工具,autotools的使用。很多GNULinux的的軟體都是用它生成Makefile的,包括我們非常熟悉的Linux核心原始碼。   1、準備:

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自動生成

1、首先,新建一個測試專案的目錄——hello:mkdir hello 然後,cd hello;編輯一個hello.c的程式碼檔案: #include <stdio.h> int main() {      printf("hello automake!\n"); } 儲存退出; 2、執行auto

makefile自動生成依賴

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

makefile自動生成依賴關係

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

自定義Mybatis自動生成程式碼規則

前言        大家都清楚mybatis-generate-core 這個工程提供了獲取表資訊到生成model、dao、xml這三層程式碼的一個實現,但是這往往有一個痛點,比如需求來了,某個表需要增加欄位,肯定需要重新執行mybatis自動生成的指令碼,但是會去覆蓋

keepalived啟動後iptables自動添加Drop規則

keepalivedkeepalived 在啟動後如果參數配置不當,會在iptables中自動添加一條DROP VIP的規則。這裏的一些參數可能會造成這個問題。1、在配置中添加了strict 或 noaccept參數。2、在全局配置下使用了vrrp_strict 參數。此參數為嚴格控制VRRP協議,不支持單播

AutomaticallyProfile 自動化引擎 MyBatis和DB溝通的引擎 (根據數據庫信息自動生成實體類那些...)

... 數據庫名 ica cmd 信息 images 類名 sources 生成 1.首先建立一個文件夾AutomaticallyProfile 文件夾內有四個jar包 :mysql.jar mybat

微信小程序自動切片生成布局軟件

小程序 小程序前端 小程序前端布局 前端 隨著生活中越來越多小程序的出現很多人都在問我們為什麽要開發小程序?????小程序有什麽用?????如何快速開發開發小程序?????. . . . . 小程序有以下優勢1、小程序不需要下載和安裝——省時省力省空間 方便王能——隨時隨地只需要打開就能用,用

makefile(06)_隱式規則

地方15.Make的隱式規則 15.1.命令覆蓋 問題1:通過各目標的命令拆分寫到不同的地方,會發生什麽?Makefile中出現同名目標時:依賴:所有的依賴將合並到一起,成為目標的最終依賴命令:當多處出現同一目標的命令時,make發出警告,所有之前定義的命令被最後的命令取代。註意:當使用include包含其他