0

私はこの Makefile を持っています:

CFLAGS = -c -Wall
CC = g++
EXEC = main
SOURCES = main.cpp listpath.cpp Parser.cpp
OBJECTS = $(SOURCES: .cpp=.o)
EXECUTABLE = tp

DIR_SRC = /src/
DIR_OBJ = /obj/

all: $(SOURCES) $(OBJECTS)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm $(OBJECTS) $(EXECUTABLE)

これに注意してください:

  • 私はディレクトリ「。」にいます。メイクファイルを含む
  • フォルダー「./src」が存在し、すべての .h および .cpp ファイルがあります
  • フォルダ "./obj" が存在しません。makefile でフォルダを作成し、そこにすべての .o を配置する必要があります

私が得るエラーは次のとおりです。

No rules to build "main.cpp", necessary for "all". Stopping.

ヘルプ!

4

2 に答える 2

1

では、上から

CFLAGS = -c -Wall
CC = g++
# EXEC = main never used, not needed
SOURCES = main.cpp listpath.cpp Parser.cpp

ここまでは順調ですね。これSOURCESは について言及していないDIR_SRCので、後でその接続を作成する必要があることに注意してください (リストの各メンバー$(DIR_SRC)$(SOURCES)にパスを追加する必要があるため、機能しません)。しかし、実際にはパスが必要です (例):OBJECTS/obj/main.o

OBJECTS = $(patsubst %.cpp, $(DIR_OBJ)%.o, $(SOURCES))
EXECUTABLE = tp

DIR_SRC = /src/
DIR_OBJ = /obj/

(個人的には、変数に末尾のスラッシュを入れるのは好きではありませんが、好みの問題です。) 最初のターゲットはデフォルトのターゲットなので、実際にビルドしたいものをビルドする必要があります。

all: $(EXECUTABLE)

ソースを前提条件としてリストすることについて心配する必要はありません。彼らは後で自分自身を整理します。

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@  # <-- note the automatic variable $^

この.cpp.o規則はここでは実際には機能しません。私たちはそれを綴る必要があります。$(DIR_SRC)そして、.cppファイルを検索するように Make に指示する必要があります。

$(OBJECTS): $(DIR_OBJ)%.o: %.cpp $(DIR_OBJ)
    $(CC) $(CFLAGS) $< -o $@

$(DIR_OBJ):
    mkdir $@

vpath %.cpp $(DIR_SRC)

clean安全のために、これは実際のターゲットではないことを Make に伝えます。

.PHONY: clean
clean:
    rm $(OBJECTS) $(EXECUTABLE)

編集:

私は一度に多くのことを試みるべきではありませんでした。もっと簡単なことを試してみましょう:

$(DIR_OBJ)%.o: $(DIR_SRC)%.cpp $(DIR_OBJ)
    $(CC) $(CFLAGS) $< -o $@
于 2012-09-16T04:06:39.330 に答える
0

を編集しSOURCESて、ソース ディレクトリ (例src/main.cppなど) を含めます。

オブジェクト ファイルについては、次のようなものを検討してください。

OBJECTS = $(subst src/,obj/,$(SOURCES:%.cpp=%.o))

# ...

all: $(SOURCES) build

.PHONY: build
build: pre_build $(EXECUTABLE)

.PHONY: pre_build
pre_build: obj

obj:
    -mkdir obj

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@
于 2012-09-16T03:43:53.683 に答える