1. 程式人生 > >Makefile自動依賴寫法

Makefile自動依賴寫法

從開始學習到了解到makefile自動依賴到目前為止總算是掌握了makefile的自動依賴寫法

因為接觸的專案程式碼分佈的問題原始檔和標頭檔案不在同一個目錄下,,網上很多makefile自動依賴的方案不能直接拿來用.所以是在其基礎上進行的改編

總體來說 是這麼個過程 

先決條件 工程目錄結構為 頂層中放置

1 Makefile 

2 src目錄放置原始檔 

3 inc目錄 

4 可能有lib目錄  

生成的程式在頂層目錄中

第一步 寫好你的環境變數 一般設定如下引數即可

CC=gcc
CFLAGS=-g -rdynamic -W -Wall
SRC=src
INC=-I. -I./inc
LIB=lib/xxxx.a   #如果有
TARGET=demo

第二步 獲取所有參與編譯的原始檔 

在這步中我所使用的是makefile提供的函式 

SOURCES = $(wildcard src/*.cpp)
OBJ=$(patsubst %.cpp, %.o,$(SOURCES))
這樣在SOURCES中獲取到的是所有參加編譯的cpp檔案 但是如果有多個目錄放置的話 可以使用追加方式新增其他的目錄下的原始檔,最好在做完這一步之後進行驗證

兩個函式的用途分別是  獲取匹配的檔案列表  和對匹配的字串進行替換 將.cpp替換成.o,具體的詳細內容可以百度,不贅述

第三步 寫下如下語句

ALL: $(TARGET)
$(TARGET):$(OBJ)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJ) $(LIB) 

很明顯是申明要生成的檔案 為TARGET也就是demo

第四步 設定自動依賴關係

%d:%cpp
	@$(CC) -MM $(CFLAGS) $< $(INC) > [email protected];
	@sed -i 's,\($(*F)\)o[ :]*,$(*D)/\1o: ,g'  [email protected] ;
	@sed 's,\($*\)o[ :]*,\1o [email protected] : ,g' < [email protected] > [email protected];
	@echo "\t$(CC) -c -o $*o $< $(INC)" >>
[email protected]
; @$(RM) [email protected] -include $(patsubst %.cpp, %.d,$(SOURCES))
這個地方有幾個位置需要注意 第一點也就是最重要的一點 

就是%d:%cpp  是沒有.

%d:%cpp  是沒有.

%d:%cpp  是沒有.

重要的事情說三遍

當然如果要加點的話可是可行的,但是需要對整個結構進行一些變形,在這裡就不展開了

解釋一下上面語句發生的事情

@$(CC) -MM $(CFLAGS) $< $(INC) > [email protected];
這句是非常通用的獲取依賴標頭檔案的方法,不過在最後的寫入檔案裡面我沒有用$$$$作為程序號設定檔名,我覺得這樣比較麻煩還需要\來支援寫在一行,直接指定一個不會重複的就可以了
@sed -i 's,\($(*F)\)o[ :]*,$(*D)/\1o: ,g'  [email protected] ;
這一句也是十分常見 第一句的結果為 a.o: src/a.cpp inc/a.h 這句話的意思為將其替換成  src/a.o: src/a.cpp inc/a.h 

這個替換對下面的有關鍵性幫助 ,因為OBJ裡面存的變數都是形如src/a.o的 與這個相對應起來

@sed 's,\($*\)o[ :]*,\1o [email protected] : ,g' < [email protected] > [email protected];
這一句不展開講,也很通用 將  src/a.o: src/a.cpp inc/a.h 替換為   src/a.o src/a.d: src/a.cpp inc/a.h 
@echo "\t$(CC) -c -o $*o $< $(INC)" >>[email protected];

這一句是分目錄src和inc編譯的關鍵,沒有這一句編譯將不能正常進行.這是在src/a.d中手動新增inc目錄進編譯選項中,沒有這個 將在編譯的時候報找不到標頭檔案

	@$(RM) [email protected]
-include $(patsubst %.cpp, %.d,$(SOURCES))
這兩句都不說了  一個是刪除,另外一個是包含src/a.d的makefile規則的檔案

到這裡我們的makefile自動依賴就完成了,可以作用於多個目錄,有著比較良好的通用性,可以試試

當然少不了clean 這個就自己寫吧

相關推薦

Makefile自動依賴寫法

從開始學習到了解到makefile自動依賴到目前為止總算是掌握了makefile的自動依賴寫法 因為接觸的專案程式碼分佈的問題原始檔和標頭檔案不在同一個目錄下,,網上很多makefile自動依賴的方案不能直接拿來用.所以是在其基礎上進行的改編 總體來說 是這麼個過程  先決

Makefile自動依賴

InGNU make, the feature of remaking makefiles makes this practice obsolete—you need nevertell make explicitly to regenerate the prerequisites, because it a

makefile自動依賴生成

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

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

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

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"應該被重建.

makefile自動生成依賴關係

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

spring IoC (六)autowiring(自動依賴裝配)的實現

emp 自動 bst () this on() 構造 clas span   在前面對IoC容器實現原理的分析中,一直是通過BeanDefinition的屬性值和構造函數以顯式的方式對Bean 的依賴關系進行管理的。在Spring中,相對這種顯式的依賴管理方式,IoC容器還

IDEA使用之讓maven專案自動依賴jar包

作者:龍丿一  來源:CSDN  原文:https://blog.csdn.net/wuyanshen2012/article/details/76985225  當我們用manven構建專案的時候,我們在pom.xml中刪除一個依賴或者新增一個依賴,

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

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

Makefile自動編譯目錄下的所有.C檔案

自動編譯目錄下的所有.C檔案的Makefile指令碼CC=gcc CFLAGS_WARN = -Wall DEFINE = INCLUDE = -I. SOURCES = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SOUR

在阿里雲的Maven庫中找jar包的依賴寫法

************************************************************* *************************************

makefile自動生成依賴性

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

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

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

多資料夾下的Makefile自動編譯

  很多時候我們可能會遇到這樣的情況:要編譯多個目錄下的程式碼,然後要將中間檔案和執行檔案分別放到不同的資料夾下面。好吧,貼圖的排版第一次用,將就看一下。下面的圖是我練習用的一個專案檔案結構圖。其中bin用來存放最後生成的可執行檔案,f1,f2分別是用到的兩個模組(函式),

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

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

在Linux下編譯核心模組的Makefile的簡單寫法

1 Makefile 新建檔案,命名為Makefile,將下面的程式碼拷貝到檔案中 #!/bin/bash obj-m += test-demo.o #CROSS_COMPILE ?= /opt/linaro/gcc-linaro-5.3-2016.02-x86_6