2017-01-29 7 views
0

makefileを使って複数の.cファイルを同時にコンパイルしたいと思います。 私はすでにこの作られた:私はなぜこれが( 『すべて」のためにやるべきことは何も』)動作しません見当がつかないmakefileで複数の.cファイルをコンパイルする

CC= gcc 

CPPFLAGS = -I. 

CFLAGS = -W -Wall -ansi -pedantic 

TARGET = test 

RM = rm 

OBJECTS = xxx.o yyy.o zzz.o 

SOURCES = $(OBJECTS:.o =.c) 

.PHONY: all clean 

all: $(TAREGT) 

clean: 

     $(RM) $(TARGET) $(OBJECTS) 

$(TAREGT) : $(OBJECTS) 

     $(CC) $^ -o [email protected] 

$(OBJECTS) : $(SOURCES) 

     $(CC) $(CFLAGS) $(CPPFLAGS) -c $^ 

を誰かがアイデアを持っている

+1

は 'TARGET'のスペルが間違っているようです:' $(TAREGT) ' –

+0

おはようありがとうございます。私は今、それは "gcc:致命的なエラー:入力ファイルがありません "と言いました。何とか入力ファイルを見つけることができません。 – Buchse

+0

変数を使用する前に変数(例: '$(info $(SOURCES))')を見てください。あなたは少なくとも1つの間違いを犯しました。また、Makeが実行しようとしているコマンドを表示します。これはMakeの出力にエラーのすぐ上に表示されます。 – Beta

答えて

2

この行は、循環依存関係を作成しています。? :

SOURCES = $(patsubst %.o,%.c,$(OBJECTS)) 
+0

これらの2行は完全に同等です。最初の変種は単なる略語です。 https://www.gnu.org/software/make/manual/html_node/Text-Functions.html –

+0

@Alexey Semenyukそれらは同等であるべきですが、そうではありません。最初のものは循環依存エラーを生成し、2番目のものは循環依存エラーを生成しません。それを試してみてください!私が持っています。 –

+0

これは同等です。この表現の真の問題は、 'o'と '='文字の間の余分な空白が機能しないことです。 'SOURCES = $(OBJECTS:.o = .c)' –

0

あなたはを忘れてしまった:

SOURCES = $(OBJECTS:.o =.c) 

このとそれを交換してみてくださいあなたの 'ソースからオブジェクトへ'ルールの。したがって、何も作成されません。

また、スペルミスがあります。$(TARGET)は「テスト」ですが、「すべて」ルールは$(TAREGT)が空です。また、 'test'をコンパイルするために入力として$(TAREGT)を使用しています。

$(SOURCES)または "オブジェクトへのソース"ルールを指定する必要はありません。暗黙のルールがそのトリックを行います。

「ソースからオブジェクトへ」というルールは間違っています。つまり、各オブジェクトはすべてのソースに依存しています。各オブジェクトが1つのソースに依存するようにするには、接尾辞ルール、パターンルール、または静的パターンルールを使用する必要があります。あるいは暗黙のルール。

0
$(OBJECTS) : $(SOURCES) 

上記はあなたの.cファイルのいずれかを変更した場合、すべての.oファイルには、すなわち、すべてのソースに依存していることを確認します告げるすべての.oファイルを再コンパイルしますしてください。あなたが本当に欲しいものではないと思います。次のように私はこのルールを手直ししたい:

$(foreach s,$(SOURCES),$(eval $(filter %$(basename $(notdir $s)).o,$(OBJECTS)): $s)) 

をこれは、SOURCES内のすべてのソースを反復OBJECTSで対応するの.oファイルを検索し、正しいルールを作成します:<obj>: <source>を。ソースファイルとオブジェクトファイルの間のより複雑なマッピングの場合には、作業が複雑です。オブジェクトファイルを別のディレクトリにビルドするときに言います。

この不可解なコードでもファイルマッピングオブジェクトには、次の奇妙なソースのために動作します

SOURCES := a.cpp boo/b.c c.C 
OBJECTS := foo/a.o bar/b.o c.o 
$(foreach s,$(SOURCES),$(eval $(filter %$(basename $(notdir $s)).o,$(OBJECTS)): $s)) 

それは次のルールを生成します:

foo/a.o: a.cpp 
bar/b.o: boo/b.c 
c.o: c.C 
0

はそれは、あなたのためにみんなが助けていただきありがとうございます現在作業中です

いくつかのルールを追加しました:

CC= gcc 
CPPFLAGS = -I. 
CFLAGS = -W -Wall -ansi -pedantic 
TARGET = test 
RM = rm 
SOURCES = xxx.c yyy.c zzz.c 
OBJECTS = $(SOURCES:.c=.o) 

.PHONY: all clean 

all: $(TARGET) 

clean: 
    $(RM) $(TARGET) $(OBJECTS) 

$(TARGET) : $(OBJECTS) 
    $(CC) $^ -o [email protected] 

%.o: %.c 
    $(CC) $(CFLAGS) $(CPPFLAGS) -c $< 
+0

最後のルールではまだ '-o $ @'はありません。同じことをする暗黙のルールがあるので、それはまだ必要ではありません。 – aragaer

関連する問題