1. 程式人生 > >makefile自動生成依賴性

makefile自動生成依賴性

在Makefile中,我們的依賴關係可能會需要包含一系列的標頭檔案,比如,如果我們的main.c中有一句“#include "defs.h"”,那麼我們的依賴關係應該是:

main.o : main.c defs.h

但是,如果是一個比較大型的工程,你必需清楚哪些C檔案包含了哪些標頭檔案,並且,你在加入或刪除標頭檔案時,也需要小心地修改Makefile,這是一個很沒有維護性的工作。為了避免這種繁重而又容易出錯的事情,我們可以使用C/C++編譯的一個功能。大多數的C/C++編譯器都支援一個“-M”的選項,即自動找尋原始檔中包含的標頭檔案,並生成一個依賴關係。例如,如果我們執行下面的命令:

cc -M main.c

其輸出是:

main.o : main.c defs.h

於是由編譯器自動生成的依賴關係,這樣一來,你就不必再手動書寫若干檔案的依賴關係,而由編譯器自動生成了。需要提醒一句的是,如果你使用GNU的C/C++編譯器,你得用“-MM”引數,不然,“-M”引數會把一些標準庫的標頭檔案也包含進來。

gcc -M main.c的輸出是:

main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \
    /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
    /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \
    /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \
    /usr/include/bits/sched.h /usr/include/libio.h \
    /usr/include/_G_config.h /usr/include/wchar.h \
    /usr/include/bits/wchar.h /usr/include/gconv.h \
    /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \
    /usr/include/bits/stdio_lim.h


gcc -MM main.c的輸出則是:

main.o: main.c defs.h

那麼,編譯器的這個功能如何與我們的Makefile聯絡在一起呢。因為這樣一來,我們的Makefile也要根據這些原始檔重新生成,讓 Makefile自已依賴於原始檔?這個功能並不現實,不過我們可以有其它手段來迂迴地實現這一功能。GNU組織建議把編譯器為每一個原始檔的自動生成的依賴關係放到一個檔案中,為每一個“name.c”的檔案都生成一個“name.d”的Makefile檔案,[.d]檔案中就存放對應[.c]檔案的依賴關係。

於是,我們可以寫出[.c]檔案和[.d]檔案的依賴關係,並讓make自動更新或自成[.d]檔案,並把其包含在我們的主Makefile中,這樣,我們就可以自動化地生成每個檔案的依賴關係了。

這裡,我們給出了一個模式規則來產生[.d]檔案:

%.d: %.c
	@set -e; rm -f [email protected]; \
         $(CC) -M $(CPPFLAGS) ___FCKpd___5lt; >; [email protected]$$; \
         sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$ >; [email protected]; \
         rm -f [email protected]$$


這個規則的意思是,所有的[.d]檔案依賴於[.c]檔案,“rm -f [email protected]”的意思是刪除所有的目標,也就是[.d]檔案,第二行的意思是,為每個依賴檔案“$<”,也就是[.c]檔案生成依賴檔案,“[email protected]”表示模式“%.d”檔案,如果有一個C檔案是name.c,那麼“%”就是 “name”,“$$$$”意為一個隨機編號,第二行生成的檔案有可能是“name.d.12345”,第三行使用sed命令做了一個替換,關於sed命令的用法請參看相關的使用文件。第四行就是刪除臨時檔案。

總而言之,這個模式要做的事就是在編譯器生成的依賴關係中加入[.d]檔案的依賴,即把依賴關係:

main.o : main.c defs.h

轉成:

main.o main.d : main.c defs.h

於是,我們的[.d]檔案也會自動更新了,並會自動生成了,當然,你還可以在這個[.d]檔案中加入的不只是依賴關係,包括生成的命令也可一併加入,讓每個[.d]檔案都包含一個完賴的規則。一旦我們完成這個工作,接下來,我們就要把這些自動生成的規則放進我們的主Makefile中。我們可以使用Makefile的“include”命令,來引入別的Makefile檔案(前面講過),例如:

sources = foo.c bar.c

include $(sources:.c=.d)

上述語句中的“$(sources:.c=.d)”中的“.c=.d”的意思是做一個替換,把變數$(sources)所有[.c]的字串都替換成[.d],關於這個“替換”的內容,在後面我會有更為詳細的講述。當然,你得注意次序,因為include是按次來載入檔案,最先載入的[.d]檔案中的目標會成為預設目標。

相關推薦

makefile自動生成依賴性

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

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

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

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

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

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選項會把包含的系統標頭檔案以及其所包含的其他系統標頭檔案也找出來了,如果我們不需要

AutoConf自動生成Makefile(基於helloworld簡單例子)

programs tom change col -a 二進制 自己 int 生成 新建一個簡單的helloworld工程文件夾,目錄結構如下 hello.h代碼: #include<stdio.h> void fprint() { printf("h

自動生成Makefile的全過程詳解

change make auto osc .cn 轉換成 otto 創建 準備 一、簡介 Linux下的程序開發人員,一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟件

一個簡單的執行程序的GNU automake自動生成Makefile的方法及案例

rect -o 創建 otool 其中 ner markdown ted head 一個簡單的執行程序的GNU automake自動生成Makefile的方法及案例 在GNU的世界裏,存在Automake這樣的工具進行自動生成Makefile文件,automake是由Per

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

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

qmake使用方法(自動生成Makefile檔案)

下面是qmake的簡單介紹和使用要領,更為詳細的資訊請參閱手冊qmake的介紹 手寫Makefile是比較困難並且容易出錯的,尤其是需要給不同的平臺和編譯器組合寫幾個Makefile。使用qmake,開發者建立一個簡單的“專案”檔案並且執行qmake生成適當的Makefile。qmake會注意所有的編譯器和平

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

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

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

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

【探索wireshark】 使用autoconf, automake等自動生成Makefile

     無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行專案開發還是安裝應用軟體,我們都經常要用到make或 make install。利用make工具,我們可以將大型的開發專案分解成為多個更易於管理的模組,對於一個包括幾百個

使用autotools自動生成Makefile並在此之上使用dh-make生成可釋出的deb程式包(詳解)

一、前言        本文將介紹如何使用autotools生成一個Makefile檔案,並在此基礎上使用dh-make和debuild生成一個可釋出的deb程式包,這也是我們在Linux下開發應用程式以及想要釋出應用程式需要做的。        無論是在Linux還是在U

automake自動生成makefile檔案

 Linux下程式設計時,為了方便編譯,往往使用Makefile檔案自動完成編譯,但是Makefile檔案本身的書寫十分複雜,規則很多。好在Linux為我們提供了自動生成功能完善的Makefile檔案的工具autoconf/automake。本文講述如何使用它們生成Make

使用autotools自動生成Makefile並在此以上使用dh-make生成可釋出的deb程式包(詳解)

一、前言        本文將介紹如何使用autotools生成一個Makefile檔案,並在此基礎上使用dh-make和debuild生成一個可釋出的deb程式包,這也是我們在Linux下開發應用程式以及想要釋出應用程式需要做的。        無論是在Lin

一個簡單的執行程式的GNU automake自動生成Makefile的方法及案例

1、autoscan 2、修改生成的configure.scan為configure.in 3、aclocal 4、autoheader 5、autoconf 6、建立Makefile.am並進行具體內容的寫入 7、automake 8、automake 9、./configure生成Makefile