Makefile приводит к ошибке компиляции

Я пытаюсь скомпилировать программу (которая не моя):

make -f makefile

… используя следующее makefile:

# Compiler for .cpp files
CPP  = g++

# Use nvcc to compile .cu files
NVCC = nvcc
NVCCFLAGS = -arch sm_20 # For fermi's in keeneland

# Add CUDA Paths
ICUDA = /usr/lib/nvidia-cuda-toolkit/include
LCUDA = /usr/lib/nvidia-cuda-toolkit/lib64

# Add CUDA libraries to the link line
LFLAGS += -lcuda -lcudart -L$(LCUDA) -lgomp

# Include standard optimization flags
CPPFLAGS = -O3 -c -I $(ICUDA) -Xcompiler -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP

# List of all the objects you need
OBJECTS  = timer.o ar1.o kGrid.o vfInit.o parameters.o

# Rule that tells make how to make the program from the objects
main :  main.o $(OBJECTS)
$(CPP) -o main main.o $(OBJECTS) $(LFLAGS)

# Rule that tells make how to turn a .cu file into a .o
%.o: %.cu
$(NVCC) ${NVCCFLAGS} $(CPPFLAGS) -c $<

# How does make know how to turn a .cpp into a .o?  It's built-in!
# but if you wanted to type it out it would look like:
# %.o: %.cpp
#       $(CPP) $(CPPFLAGS) -c $<

clean :
rm -f *.o
rm -f core core.*

veryclean :
rm -f *.o
rm -f core core.*
rm -f main

Что приводит к следующим командам:

nvcc -arch sm_20  -O3 -c -I /usr/lib/nvidia-cuda-toolkit/include -Xcompiler -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP -c main.cu
g++  -O3 -c -I /usr/lib/nvidia-cuda-toolkit/include -Xcompiler -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP  -c -o timer.o timer.cpp
g++: error: unrecognized command line option â-Xcompilerâ
make: *** [timer.o] Error 1

Я не понимаю makefile: -xCompiler флаг (в переменной CPPFLAGS) должен использоваться только nvcc компилятор, а не g++, Поэтому я понимаю, почему я получаю ошибку. Тем не менее, я не понимаю, из моего базового понимания makefile выше, почему в какой-то момент переменная CPPFLAGS следует g++ (переменная CPP). Я не вижу такой последовательности в makefile,

1

Решение

Ваш main Правило требует timer.o, Там нет явного правила для timer.o поэтому make использует встроенное неявное правило (как упомянуто в комментарии в конце вашего make-файла). Неявное правило для конвертации .cpp файлы в .o файлы имеют вид

$(CPP) $(CPPFLAGS) -c $<

Поэтому он компилируется с использованием параметров в CPPFLAGS который содержит -Xcompiler, Вы, вероятно, хотите -Xcompiler флаг быть в NVCCFLAGS и не CPPFLAGS,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]