2016-10-13 2 views
0

Прямо в точку:Где находится файл nvcc place .o? Они появляются в том каталоге, когда я компилирую

У меня есть следующая структура файла:

  • MAPA: Makefile, main.c, step.cu, step.h, mapB
  • mapB: model.cu, model.cuh, model_init.c, model_init.h

компилировать эту структуру следующим Makefile, с помощью команды "грим MODEL = mapB ":

MODELDIR := ./$(MODEL) 

MODULES := $(MODELDIR) 
CFLAGS += -I. $(patsubst %,-I%,$(MODULES)) 
NVCFLAGS += -I. $(patsubst %,-I%,$(MODULES)) 

NVCC += nvcc 
NVCFLAGS += -arch=sm_30 --ptxas-options=-O1 
CFLAGS += -Wall -pedantic 
LDLIBS += -lz -lpthread 

CFLAGS += -g 

SRCS += step.cu $(MODELDIR)/model.cu $(MODELDIR)/model_init.c \ 
    main.c 

OBJS += step.o $(MODELDIR)/model.o $(MODELDIR)/model_init.o 


all: .depend runmodel 

dims.h: gen_dims.sh 
    ./gen_dims.sh 1024 1024 

runmodel: ${OBJS} main.o 
    ${NVCC} ${NVCFLAGS} ${LDLIBS} $^ -o [email protected] 

%.o: %.cu 
    ${NVCC} ${NVCFLAGS} -dc $< 

.PHONY: depend clean test 

depend: 
    ${NVCC} ${NVCFLAGS} -M ${SRCS} > .depend 

.depend: ${SRCS} makefile dims.h 
    ${NVCC} ${NVCFLAGS} -M ${SRCS} > .depend 

clean: 
    ${RM} ${OBJS} runmodel compare *.cmo *.cmx *.cmi *.o 

include .depend 

Это дает nvlink ошибку, а именно" nvlink фатальное: Не удалось открыть входной файл «mapB/model.o"

Я смотрел на то, где .o файлы размещены и моя структура файла с .o-файлов, созданных с этим Makefile выглядит следующим образом:

  • MAPA: Makefile, main.c, main.o, step.cu, step.o, step.h, model.o, mapB
  • mapB: model.cu, model.cuh, model_init.c, model_init.o, model_init.h

Есть ли кто-нибудь, что имеет представление о том, почему появляется файл model.o в верхнем каталоге вместо в подпапке, которая делает это позже в процессе компиляции, ее невозможно найти?

Решение для решения этой проблемы также будет приветствоваться.

+2

из которых каталога компилятор время вызывается? По умолчанию большинство (все?) Компиляторов помещают объектные файлы в * текущий * каталог. – njuffa

+1

Я не понимаю ваш вопрос. Из взгляда вашего Makefile nvcc испускает файлы onject именно там, где вы его просите. – talonmies

+1

Я не могу воспроизвести вашу ошибку. Какую версию Make вы используете? И какую команду вы видите, когда она создает 'model.o'? – Beta

ответ

3

Я не NVCC играть, так что я не могу быть уверен, но я предлагаю вам попробовать это, и сказать нам результат:

%.o: %.cu 
    ${NVCC} ${NVCFLAGS} -dc $< -o [email protected] 
+0

Спасибо большое! Он компилируется и работает сейчас. Просто следующий вопрос: что делает -o $ @ на самом деле?И в чем разница между $ <и $^(код .cu имеет $ <, но c-код имеет $ ^)? Ссылка на правильную страницу руководства также прекрасна, но эти символы не дают никаких результатов в качестве поисковых запросов. – Tim

+2

'-o' - [командная опция для nvcc, указывающая выходной файл] (http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/#file-and-path-specifications). Вы скажете nvcc «-o foo.o», он назовет выходной файл «foo.o». Переменные '$ <' и '$ ^' являются двумя из [Автоматических переменных Make] (https://www.gnu.org/software/make/manual/make.html#Automatic-Variables), где '$ ^' является списком предварительных условий правила, а '$ <' является первым членом этого списка. Поэтому, если ваше правило начинается с «foo.o: foo.cu bar.h», $^является «foo.cu bar.h», а $ <является «foo.cu». – Beta

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