0

私のmakefileは問題なく動作します(GNU Make)が、

  • 新しいディレクトリ「bin」を作成し、そこにすべての.oを配置する方法があります
  • 「1」の答えが「はい」の場合、「makeclean」の指示でフォルダ「bin」を削除できますか?
  • すべての.cppおよび.oファイル名を書き込む必要はありませんか?
CFLAGS = -Wall -g
CC = g++
EXEC = main
OBJ = listpath.o Parser.o main.o

all: $(EXEC)

listpath.o: src/listpath.cpp
  $(CC) $(CFLAGS) -c src/listpath.cpp

Parser.o: src/Parser.cpp 
  $(CC) $(CFLAGS) -c src/Parser.cpp

main.o: src/main.cpp
  $(CC) $(CFLAGS) -c src/main.cpp

$(EXEC): $(OBJ)
  $(CC) $(CFLAGS) $(OBJ) -o $(EXEC)

.cpp.o:
  $(CFLAGS) $<

.PHONY: clean
clean:
  rm $(OBJ) $(EXEC)
4

3 に答える 3

3

最後の質問から始めて、.cファイルを.oファイルに変換するための暗黙のルールを定義できます。

bin/%.o : src/%.cpp | bin
  $(CC) $(CFLAGS) -c $< -o $@

これにより、.oファイルもbin/ディレクトリに出力されます。

これで、結果ルールは次のようになります。

$(EXEC): $(addprefix bin/, $(OBJ))
  $(CC) $(CFLAGS) $^ -o $@

bin /ディレクトリをクリーンアップするには、クリーンルールを次のように変更するだけです。

clean:
  rm -rf bin/ $(EXEC)

最後に、binディレクトリを作成するルールを追加します。

bin:
  mkdir -p bin
于 2012-09-16T18:31:21.173 に答える
2

.oファイルなどの中間製品ではなく、ソースからのものを指定することをお勧めします。パターン置換を使用して、これらの中間製品の名前を生成します。同じパターンを使用してすべてのファイルをコンパイルしている場合は、何度も指定する必要はありません。makeのパターンを使用します。

# The first rule that make sees is the default target.
# I like to put the default target right up front so there is no doubt.
default: all

SRC = src/listpath.cpp src/Parser.cpp src/main.cpp
# Or SRC = $(wildcard src/*.cpp)

# Generate list of object files.
OBJ = $(patsubst %.cpp, bin/%.o, $(notdir $(SRC)))

# Compile rule
$(OBJ): bin/\%.o : src/%.cpp bin
   $(CC) $(CFLAGS) -c $< -o $@

bin:mkdir bin

# Link rule
$(EXEC): $(OBJ)
  $(CC) $(CFLAGS) $(OBJ) -o $(EXEC)

all: $(EXEC)

clean:
   rm -rf bin $(EXEC)
于 2012-09-16T18:50:28.777 に答える
0

cmakeやqmakeなどのmakefile構築ツールの使用を検討してください。私の経験では、makefile内のすべてのソースファイルに明示的に名前を付けないのは危険です。

onlinuxの場合は、簡単に試してみてください

qmake -project && qmake && make

ソースディレクトリにあります。QMakeは、makefileを作成するためのすべての魔法を実行します。私は、cmakeもそれを行うと信じています。

于 2012-09-16T18:33:01.870 に答える