0

明示的な依存関係を含むきちんとしたmakefileが必要ですが、すべての.oオブジェクトを別のディレクトリに配置して、後で(別のファイルに)完全にリンクします。

問題は、最初のソースをコンパイルした後にmakeが停止し、エラーなしで停止することです。

CC=gcc
CFLAGS=-c -Wall -pedantic -std=c99

DIR=../obj

$(DIR)/CList.o : CList.c CList.h CList_aux.h Observation.h CList_View_aux.h
    $(CC) $(CFLAGS) CList.c -o $@
$(DIR)/CList_aux.o : CList_aux.c CList.h CNode.h
    $(CC) $(CFLAGS) CList_aux.c -o $@
$(DIR)/CList_View_aux.o : CList_View_aux.c CNode.h Observation.h
    $(CC) $(CFLAGS) CList_View_aux.c -o $@
$(DIR)/CNode.o : CNode.c CNode.h CNode_aux.h Observation.h CList.h
    $(CC) $(CFLAGS) CNode.c -o $@
$(DIR)/CNode_aux.o : CNode_aux.c CNode.h Observation.h
    $(CC) $(CFLAGS) CNode_aux.c -o $@
$(DIR)/Observation.o : Observation.c Observation.h Observation_aux.h CNode.h
    $(CC) $(CFLAGS) Observation.c -o $@
$(DIR)/Observation_aux.o : Observation.c Observation.h
    $(CC) $(CFLAGS) Observation_aux.c -o $@
$(DIR)/Record.o : Record.c Record.h Observation.h
    $(CC) $(CFLAGS) Record.c -o $@
4

2 に答える 2

0

Makefileが実際に投稿したものと同じである場合は、all:ルールがありません。明示的なallルールがない場合、makeは最初の現在のルールが作成されることを想定しているため、その後停止します。目的を達成するには、これをMakefileに追加(追加)します(最終的な実行可能ファイル名をそれぞれ変更します)。

OBJECTS = $(wildcard $(DIR)/*.o)

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        $(LD) $(LDFLAGS) -o $@ $^
于 2012-10-18T20:26:27.977 に答える
0

デフォルトでmakeは、makefileに最初のターゲットをビルドします。この場合、それは${DIR}/CList.oです。

別の最初のターゲットが必要です。これは通常、次のように呼ばれallます。

OBJECTS = \
    $(DIR)/CList.o \
    $(DIR)/CList_aux.o \
    $(DIR)/CList_View_aux.o \
    $(DIR)/CNode.o \
    $(DIR)/CNode_aux.o \
    $(DIR)/Observation.o \
    $(DIR)/Observation_aux.o

all: ${OBJECTS}

これは、にオブジェクトファイルがあるかどうかに関係なく機能することに注意してください${DIR}。ディレクトリ内のオブジェクトファイルを探すワイルドカードは、一度コンパイルされたものが最新であることを確認しますが、以前にコンパイルできなかったもの、または単にそこにないものをビルドしようとはしません。

于 2012-10-18T20:34:47.567 に答える