1. 程式人生 > >makefile 自動生成標頭檔案依賴關係

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

在使用makefile 自動生成標頭檔案依賴是,大家多半使用了下面這個方法。


這個sed語句被稱之為 "上帝的符號",可讀性不言而喻。(PS:CSDN這個排版怎麼也搞不好,只能用圖片了。)

gcc的 -MMD 選項可以自動生成帶有依賴規則的.d檔案,為建立標頭檔案依賴帶來了方便。

示例如下:

CC     = gcc

TARGET = main.out
LDLIBS = -m32 -Wl,--as-needed
CFLAGS = -m32 -g -MMD -MP -Wall -c

SRCS = main.c
ODIR = ./objs
OBJS = $(addprefix $(ODIR)/,$(SRCS:.c=.o))
DEPS = $(addprefix $(ODIR)/,$(SRCS:.c=.d))

.PHONY: all clean $(ODIR)

all: $(ODIR) $(TARGET)
	
$(TARGET): $(OBJS)
	$(CC) $(LDLIBS) $(OBJS) -o 
[email protected]
$(ODIR)/%.o: %.c $(CC) $(CFLAGS) -o [email protected] $< -include $(DEPS) $(ODIR): @test -d [email protected] || mkdir -p [email protected] clean: rm -rf $(ODIR) rm -f $(TARGET)
測試程式碼:
/*main.c*/

#include <stdio.h>
#include "test.h"

int main(int argc, char *argv[])
{
    printf("hello world! xtest=%d\n", xtest);
    return 0;
}

/*test.h*/
#define xtest (1)

[
[email protected]
:makefile]# ll 總用量 20 drwxr-xr-x 2 root root 4096 Oct 26 16:42 ./ drwxr-xr-x 8 root root 4096 Oct 25 17:36 ../ -rw-r--r-- 1 root root 136 Oct 26 16:09 main.c -rwxr--r-- 1 root root 488 Oct 26 16:18 makefile* -rw-r--r-- 1 root root 20 Oct 26 16:09 test.h [[email protected]:makefile]# make gcc -m32 -g -MMD -MP -Wall -c -o objs/main.o main.c gcc -m32 -Wl,--as-needed ./objs/main.o -o main.out [
[email protected]
:makefile]# cat ./objs/main.d objs/main.o: main.c test.h test.h: [[email protected]:makefile]# touch test.h [[email protected]:makefile]# make gcc -m32 -g -MMD -MP -Wall -c -o objs/main.o main.c gcc -m32 -Wl,--as-needed ./objs/main.o -o main.out [[email protected]:makefile]#
原理分析:
gcc -MMD -MP *.c 生成帶有標頭檔案依賴關係的*.d
展開這個makefile的關鍵部分
CC     = gcc
TARGET = main.out
LDLIBS = -m32 -Wl,--as-needed
CFLAGS = -m32 -g -MMD -MP -Wall -c

SRCS = main.c
ODIR = ./objs
OBJS = $(addprefix $(ODIR)/,$(SRCS:.c=.o))
DEPS = $(addprefix $(ODIR)/,$(SRCS:.c=.d))

.PHONY: all clean $(ODIR)

all: $(ODIR) $(TARGET)
	
$(TARGET): $(OBJS)
	$(CC) $(LDLIBS) $(OBJS) -o [email protected]

#$(ODIR)/%.o: %.c
objs/main.o: main.c
#	$(CC) $(CFLAGS) -o [email protected] $< 
	gcc -m32 -g -MMD -MP -Wall -c -o objs/main.o main.c
	
#-include $(DEPS)
#-include main.d
objs/main.o: main.c test.h #-MMD選項生成
test.h:                    #-MP 選項生成

$(ODIR):
	@test -d [email protected] || mkdir -p [email protected]

clean:
	rm -rf $(ODIR)
	rm -f $(TARGET)
合併相同的目標,makefile的最終形式為:
CC     = gcc
TARGET = main.out
LDLIBS = -m32 -Wl,--as-needed
CFLAGS = -m32 -g -MMD -MP -Wall -c

SRCS = main.c
ODIR = ./objs
OBJS = $(addprefix $(ODIR)/,$(SRCS:.c=.o))
DEPS = $(addprefix $(ODIR)/,$(SRCS:.c=.d))

.PHONY: all clean $(ODIR)

all: $(ODIR) $(TARGET)
	
$(TARGET): $(OBJS)
	$(CC) $(LDLIBS) $(OBJS) -o [email protected]

objs/main.o: main.c test.h
	gcc -m32 -g -MMD -MP -Wall -c -o objs/main.o main.c
	
test.h:

$(ODIR):
	@test -d [email protected] || mkdir -p [email protected]

clean:
	rm -rf $(ODIR)
	rm -f $(TARGET)

關於test.h:

如果沒有這個目標,當頭檔案被刪除或者忘了包含時,make報錯如下:

[[email protected]:makefile]# make
gcc -m32 -g -MMD -Wall -c  -o objs/main.o main.c
gcc -m32 -Wl,--as-needed ./objs/main.o -o main.out
[[email protected]:makefile]#
[[email protected]:makefile]#
[[email protected]:makefile]#
[[email protected]:makefile]# mv test.h test.x
[[email protected]:makefile]# make
make: *** 沒有規則可以建立“objs/main.o”需要的目標“test.h”。 停止。
[[email protected]:makefile]#

加上test.h: make報錯如下:

[[email protected]:makefile]# make
gcc -m32 -g -MMD -MP -Wall -c -o objs/main.o main.c
gcc -m32 -Wl,--as-needed ./objs/main.o -o main.out
[[email protected]:makefile]#
[[email protected]:makefile]# mv test.h test.x
[[email protected]:makefile]# make
gcc -m32 -g -MMD -MP -Wall -c -o objs/main.o main.c
main.c:3:18: fatal error: test.h: 沒有那個檔案或目錄
 #include "test.h"
                  ^
compilation terminated.
make: *** [objs/main.o] 錯誤 1
[[email protected]:makefile]#

因為目標test.h 沒有對應的規則,所以make會繼續向下進行,從而準確的定位出產生錯誤的原因。


相關推薦

makefile 自動生成檔案依賴關係

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

pycharm自動生成檔案註釋

1、在file->settings->file and code templates->python script即可自定製pycharm建立檔案自動生成的標頭檔案註釋資訊 2、建立py檔案自動生成效果圖 3、可以自定製新增的標頭檔案註釋內容如下: 3.編輯內容  

gsoap+URL自動生成檔案與客戶端程式碼流程

1、下載gsoap程式碼下載連結     下載以後解壓,進入\gsoap-2.8\gsoap-2.8\gsoap\bin\win32這個目錄下面有兩個執行檔案soapcpp2.exe 與wsdl2h.exe     wsdl2h.exe這個是生成標頭檔案的     so

Android Studio配置javah自動生成檔案

一: Javah的配置 1. File -> Setting ->Tools -> External Tools,點選加號新增新的Tools; 2. 設定Tools資訊 Arguments的設定: 三個引數: Program:$J

Linux學習筆記-Makefile優化之檔案依賴

如果標頭檔案被更新,則包含了它的cpp檔案應該被重新編譯。 比如first裡面有個函式,main函式呼叫了first裡面的函式,那麼first.h變化了,main肯定要重新編譯 這裡有個知識點: -MMD 【這是編譯器使用的選項】 g++/gcc 編譯xxx.cp

iOS 開發: 解決Xcode7.3 不能自動索引檔案,檔名等問題

iOS 開發: 解決Xcode7.3 不能自動索引標頭檔案,檔名,程式碼補全等問題 解決方案: 開啟Xcode –> Target –> BuildSettings –> Apple LLVM 7.1 -Language-Objective C 下面的 Weak

JNi程式設計生成檔案

最近在學習JNI程式設計,但是剛開始就遇到了麻煩,生成不了標頭檔案!!!! 在查找了大量資料之後,終於找到了解決方案: ①先寫一個類,把native方法的呼叫寫在裡面 ②到根目錄下執行javac test.java生成.class檔案 ③回到src目錄,執

javah 生成檔案時,報錯找不到類android.graphics.Bitmap或者找不到 xxxx的類檔案

1.首先編譯執行一下專案,讓要生成標頭檔案的類,編譯成class檔案。 2. 命令列進入,“專案目錄”\app\build\intermediates\classes\debug  例如 F:\LibJpeg\app\build\intermediates\classes\

使用gSoap根據wsdl檔案生成檔案報錯 Error -1 fault: SOAP-ENV:Client [no subcode]

近來我在linux上使用gSoap,根據客戶提供的WSDL檔案生成標頭檔案的時候,不知什麼原因老報錯,資訊如下: [[email protected] usertools]# wsdl2h  -o AAAserver.h AAAserver.wsdl **  T

檔案依賴pimpl法

標頭檔案依賴,Pimpl法,加速編譯   舉個例子:      // File: SoundSystem.h      #include "StreamFilter.h"      #include "Emitters."class SoundSystem {      

java 10 生成檔案(javah不是內部或外部命令)(java呼叫c)

在用java呼叫c的過程中,需要對java檔案生成對應的.h標頭檔案。 網上一些教程使用的方法(javah -jni 目標檔案)已經過時,這是因為java10已經移除了javah的相關功能。 為了使用java 10生成標頭檔案,在windows的cmd命令列中使用以下命令

bat指令碼 -- iar自動查詢檔案

1、新建一個指令碼檔案:bat @ECHO off ECHO processing.... ::note 1 FOR /R %%i IN (*.h) DO (

STM32 HAL庫檔案包含關係

如圖,從左到右下的順序寫:   -----------------------------------------------------------------------------------------------------------------------

Android Studio的NDK開發之 用javah生成檔案

作為一個Android開發初學者,之前一直是用C++在寫程式,最近需要開發一個APP,不得不開始學習java以及學習使用AS進行Android開發。 因為從C++轉過來的,想省點力氣從學習NDK開發入手,可是一天下來,走到javah生成標頭檔案這步卻怎麼也走不動了,看了很多

JNI用javah命令生成檔案

以下程式碼在Android中JNI的使用之HelloWorld的基礎上操作 可以在Eclipse工具的android工程下–>右鍵android tools–>add native support,彈出一個窗體,然後自定義庫名(xxx.so)–

利用python+graphviz繪製資料結構關係圖和指定目錄下檔案包含關係

  作為一名linux系統下的C語言開發,日常工作中經常遇到兩個問題:   一是分析程式碼過程中,各種資料結構互相關聯,只通過程式碼很難理清系統中所有結構體的整體架構,影響程式碼消化的效率;   二是多層標頭檔案巢狀包含,在新增需要被多處引用的結構體或者函式介面時,難以找到合適的地方放置結構體和函式介面的定義

Makefile中如何根據原始檔自動生成其所需要的檔案

前言 Makefile自動生成標頭檔案依賴是很常用的功能,本文的目的是想盡量詳細說明其中的原理和過程。 Makefile模板 首先給出一個本人在小專案中常用的Makefile模板,支援自動生成標頭檔案依賴。 CC = gcc CFLAGS = -Wa

檔案之間存在依賴關係該如何包含?

本文旨在探討標頭檔案之間存在依賴關係時,包含順序的影響。 分兩種情況討論: 標頭檔案A單方面依賴標頭檔案B: struct.h: struct abc { int num; char *ptr; }; def.h: typedef struct abc AB

VS2015建立一個完整的c++工程:檔案.h 原始檔.cpp,自動生成

開啟VS2015 ,新建VS win32工程,前面步驟很簡單,不再闡述 下面直接開始: 新建一個VC++ win32的程式, 在原始檔加下新增.cpp檔案,一般放main函式 #include <iostream> #include <locale&

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

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