3

Makefile を使用してプロジェクトをコンパイルしようとしていますが、どういうわけか -fopenmp フラグが機能しません。メイクファイルは次のとおりです。

TARGET=isaac
CC=g++
CFLAGS=-Wall -O2 -fopenmp
LDFLAGS=-lm -lpthread -lrt

OBJ=src/main.o src/bhtree.o src/body.o src/configreader.o src/diagnostics.o src/output.o src/quad.o src/timing.o src/vector2.o

isaac: $(OBJ)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJ) $(LDFLAGS)

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

clean: 
rm src/*.o src/*~ isaac

「make」を呼び出したときの出力は次のとおりです

g++    -c -o src/main.o src/main.cpp
g++    -c -o src/bhtree.o src/bhtree.cpp
g++    -c -o src/body.o src/body.cpp
g++    -c -o src/configreader.o src/configreader.cpp
g++    -c -o src/diagnostics.o src/diagnostics.cpp
g++    -c -o src/output.o src/output.cpp
g++    -c -o src/quad.o src/quad.cpp
g++    -c -o src/timing.o src/timing.cpp
g++    -c -o src/vector2.o src/vector2.cpp
g++ -Wall -O2 -fopenmp -o isaac src/main.o src/bhtree.o src/body.o src/configreader.o src/diagnostics.o src/output.o src/quad.o src/timing.o src/vector2.o -lm -lpthread -lrt

ソースファイルのコンパイル時に -fopenmp フラグが欠落しているため、完成した実行可能ファイルは並列ではなく直列です。

どうすればこれを修正できますか?

4

1 に答える 1

2

問題は、あなたのルールがまったく適用されないことです。削除は自由です

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

以前と同じ結果が得られます。これは、あなたの代わりに事前定義されたルールが使用されているためです (ただし、私はメイクファイルの専門家ではありません)。

問題の核心は、ルールが./*.oファイル./src/*.o用であるが、 isaac. ルールを変更できます

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

または (より良い) すべての自動生成された譜表を src からどこかに移動します。

于 2013-10-27T17:34:50.750 に答える