Я пытаюсь скомпилировать программу (которая не моя):
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
,
Ваш main
Правило требует timer.o
, Там нет явного правила для timer.o
поэтому make использует встроенное неявное правило (как упомянуто в комментарии в конце вашего make-файла). Неявное правило для конвертации .cpp
файлы в .o
файлы имеют вид
$(CPP) $(CPPFLAGS) -c $<
Поэтому он компилируется с использованием параметров в CPPFLAGS
который содержит -Xcompiler
, Вы, вероятно, хотите -Xcompiler
флаг быть в NVCCFLAGS
и не CPPFLAGS
,
Других решений пока нет …