我正在尝试使用Makefile编译我的项目,但是-fopenmp标志不起作用。
这是Makefile:
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标志丢失,因此完成的可执行文件是串行的,而不是并行的。
我怎样才能解决这个问题?
最佳答案
问题是您的规则根本不适用。您可以随意删除
%.o: src/%.cpp
$(CC) $(CFLAGS) -c $<
您将获得与以前相同的结果。那是因为使用了一些预定义规则而不是您的规则(尽管我不是很棒的makefile专家)。
问题的核心是您的规则适用于
./*.o
文件,但是您需要./src/*.o
作为isaac
。您可以更改规则src/%.o: src/%.cpp
$(CC) $(CFLAGS) -c $<
或者(最好)将所有自动生成的人员从src移到某个位置。