2013-10-27 2 views
3

Я пытаюсь скомпилировать свой проект с помощью Makefile, но так или иначе флаг -fopenmp не будет работать. Вот Makefile:OpenMP 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 

и здесь выход при вызове «сделать»

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 флаг отсутствует, если исходные файлы компилируются, поэтому готовый исполняемый последовательный порт, не параллельны друг другу.

Как это исправить?

+0

'g ++ -Wall -O2 -fopenmp -o isaac', он находится прямо там – OneOfOne

+0

действительно означает' make -j4', чтобы скомпилировать несколько файлов за одно и то же время? – OneOfOne

+1

Но этого не хватает для компиляции исходных файлов, , поэтому все файлы * .o являются серийными, что означает, что флаг не используется , когда соединение выполнено – user2925520

ответ

2

Проблема в том, что ваше правило не применяется вообще. Вы можете удалить

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

и вы получите тот же результат, что и раньше. Это связано с тем, что вместо вашего использования используется определенное предопределенное правило (я не специалист по make-файлу).

Основная проблема заключается в том, что ваше правило предназначено для файлов ./*.o, но вам необходимо ./src/*.o для isaac. Вы можете изменить свое правило

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

Или (лучше) переместить все автогенерированные сотрудники где-нибудь из src.

Смежные вопросы