0

Makefile を 2 つではなく 4 つのディレクトリを参照するように調整しています (ソース ファイル用に 1 つとヘッダー ファイル用に 1 つありましたが、共通ソースとインクルード用に新しいフォルダーを追加しました)。次のようなものがあります。

CC = g++
FLAGS = -g -c

BUILDDIR = build
INCLUDEDIR = -Icode/inc -I../common/code/inc -I/usr/include/libxml2

SOURCEDIR = code/src ../common/code/src
SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)
OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES))

EXECUTABLE = Exec

all: $(BUILDDIR)/$(EXECUTABLE)

$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS)
    $(CC) $^ -o $@ -lpthread -lxml2

$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp
    $(CC) $(FLAGS) $< $(INCLUDEDIR) -o $@ -Wno-write-strings

次のように、INCLUDEDIR に 1 つのエントリを追加しようとしました。

-I../common/code/inc

../common/code/src を SOURCEDIR に追加:

SOURCEDIR = code/src ../common/code/src

これは現在機能していません。修正方法を教えてください。エラーが発生しています:

Makefile:27: target `code/src' doesn't match the target pattern

しかし、これまでのところ修正方法が見つかりません。どんな助けでも大歓迎です。

編集: 以下の MadScientist の応答に従った後、次の出力が得られます。

g++    -c -o code/src/Client.o code/src/Client.cpp
code/src/Client.cpp:1:20: fatal error: Client.h: No such file or directory
compilation terminated.
make: *** [code/src/Client.o] Error 1

更新されたメイクファイル:

SOURCEDIR = code/src ../common/code/src
SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCEDIR)))
OBJECTS = $(SOURCES:%.cpp=%.o)

$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS)
    $(CC) $^ -o $@ -lpthread -lxml2

$(BUILDDIR)/%.o : ../common/code/src/%.cpp
    $(CC) $(FLAGS) $< $(INCLUDEDIR) -o $@ -Wno-write-strings

$(BUILDDIR)/%.o : code/src/%.cpp
    $(CC) $(FLAGS) $< $(INCLUDEDIR) -o $@ -Wno-write-strings

PS:

以下を使用して修正できました。

SOURCEDIR = code/src ../common/code/src
SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCEDIR)))
TEMP_OBJ = $(SOURCES:%.cpp=%.o)
NOT_DIR = $(notdir $(TEMP_OBJ))
OBJECTS = $(addprefix $(BUILDDIR)/, $(NOT_DIR))
4

1 に答える 1

1

確かに、静的パターン ルールは次のように展開されるためです。

$(OBJECTS): build/%.o : code/src ../common/code/src/%.cpp

これは不正な構文です。静的パターン ルールの使用を避け、代わりにパターン ルールを使用すると、問題なく機能します。1 つの静的パターン ルールを 2 つのパターン ルールに置き換えます。

$(BUILDDIR)/%.o : code/src/%.cpp
        $(CC) $(FLAGS) $< $(INCLUDEDIR) -o $@ -Wno-write-strings

$(BUILDDIR)/%.o : ../common/code/src/%.cpp
        $(CC) $(FLAGS) $< $(INCLUDEDIR) -o $@ -Wno-write-strings

編集:SOURCEDIRの他の用途も変更する必要があります:

SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCEDIR))
OBJECTS = $(patsubst %.cpp,$(BUILDDIR)/%.o,$(notdir $(SOURCES)))
于 2013-06-18T21:28:30.680 に答える