c++ - OpenMP Makefile,-fopenmp 不起作用

标签 c++ makefile

我正在尝试使用 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 标志,因此完成的可执行文件是串行的,而不是并行的。

我该如何解决这个问题?

最佳答案

问题是您的规则根本不适用。您可以随意删除

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

你会得到和以前一样的结果。那是因为使用了一些预定义的规则而不是你的规则(虽然我不是很好的 makefile 专家)。

问题的核心是你的规则是针对./*.o文件的,但是对于isaac你需要./src/*.o 。你可以改变你的规则

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

或者(更好)将所有自动生成的人员从 src 移动到某个地方。

关于c++ - OpenMP Makefile,-fopenmp 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19620792/

相关文章:

c++ - 没有规则来制定目标(Hyperion)

运行 make CentOS 时出现 OpenCV 错误

C++17 Using Class Template Argument Deduction 关于保存函数返回值的类型的指南

c++ - 在消费者循环中重用 unique_lock

c++ - 使用多个处理器加速程序

C++, "Old Fashioned"方式

c++ - 共享库中的类和静态变量

c++ - 如何使用动态内存分配将值传递给对象构造函数的声明

makefile - GNU Makefile 中的 For 循环——将所有目标文件收集到多个目录中的一个变量中

variables - Makefile:如何在规则的左侧使用变量?