2012-05-09 5 views
4

Makeの暗黙のルールはMakefileを書くのを簡単にすると思われますが、私の理解が正しいならば、私のCファイルがヘッダファイルに依存するなら、明示的にルールを書く必要があります。私は正しい?ほとんどのCファイルは2つのヘッダファイルに依存しているので、これは暗黙のうちに暗黙のルールの有用性を低下させるようです。暗黙的なルールとヘッダファイルを作る

+1

http://stackoverflow.com/a/9598716/412080 –

+0

Ah!私はGoogleとStackOverflowを30分くらい検索して見つけられなかったと誓っています! – Elektito

答えて

5

ルールを記述する必要はなく、依存関係のみを記述する必要があります。例:

foo.o : foo.h bar.h 

ファイルfoo.oのは、まだ暗黙のルールによって生成されたが、追加の依存関係foo.hbar.hを持っています。この依存関係の行は、ほとんどのコンパイラで自動生成することもできます。

+0

ありがとうございます。これは少なくとも負担を軽減します!ところで、私はMakefilesを書いているコンパイラについて聞いたことがありません。それはどのように機能するのですか?私はgcc 4.7.0を使用します。 – Elektito

+2

@Homaymoon: GCCの '-M'フラグ(http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options)を参照してください。 –

+0

ありがとうございます。少なくとも少し複雑なプロジェクトでは、少し使いにくいようです。私は通常、Makefileに入れて忘れるすべてのcflagsを与える必要があります。また、-MMを使用していても、$(pkg-config --cflags glib-2.0)をgcc行に追加する必要があったため、すべてのglibヘッダーが出力されます。 – Elektito

2

makeではないあなたのCファイルの中を行き来し、どのヘッダを含んでいるかを判断するユーティリティ。変更されたファイルのタイムスタンプに基づいて動作します。したがって、ターゲットがヘッダーやその他のファイルに依存しているかどうかにかかわらず、明示的に依存関係をmakeに伝える必要があります。

gccは、あなたがこの

main.cの

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

int main() 
{ 
return 0; 
} 

そして、今

gcc -M main.c 

-Mと同じようにあなたのための依存関係のリストを生成することによって、あなたの仕事を楽にすることができますプリプロセッサフ​​ラグを指定すると、

01のような依存関係リストが自動的に生成されます
main.o: main.c /usr/include/stdio.h /usr/include/features.h \ 
/usr/include/bits/predefs.h /usr/include/sys/cdefs.h \ 
/usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \ 
/usr/include/gnu/stubs-64.h \ 
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h \ 
/usr/include/bits/types.h /usr/include/bits/typesizes.h \ 
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ 
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stdarg.h \ 
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ 
my_header.h 

gccstdio.hも含まれています。

6

あなたはコードがあなたの特定のルールセットで動作するようにいくつかの調整が必要になる場合があります、次のメイクファイルの断片

SOURCES := $(wildcard *.c) 
DEPS := $(SOURCES:%.c=%.d) 
CFLAGS += -MMD 

-include $(DEPS) 

を使用してgccでヘッダの依存関係を自動生成することができます。

+0

今、良いアイデアがあります! – Elektito

関連する問題