2016-09-14 4 views
0

Мой проект имеет следующую структуру каталогов:Марка: * .h нет такого файла или каталога

  • main.cu
  • FA_kernels/* у.е.
  • FD_kernels/* у.е.
  • MEM_kernels.. /*.cu
  • MOD_kernels/*. куб
  • заголовки/*. ч

Где * .extension означает кучу файлов с этим расширением. Я не могу заставить makefile работать правильно. Ошибка я получаю:

FA_kernels/FA_SFD.cu:2:20: fatal error: FA_SFD.h: No such file or directory 
#include "FA_SFD.h" 
        ^

Моя цель была для -I заголовков необходимо указать компилятору, что делает каталог заголовков для поиска. Ясно, что это не сработало. Вот файл makefile:

CC  := nvcc 
LD  := nvcc 

MODULES := FA_kernels FD_kernels MEM_kernels MOD_kernels . 
SRC_DIR := $(MODULES) 
BUILD_DIR := $(addprefix build/,$(MODULES)) 

SRC  := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cu)) 
OBJ  := $(patsubst src/%.cu,build/%.o,$(SRC)) 
INCLUDES := $(addprefix -I,headers) 

vpath %.cu $(SRC_DIR) 

define make-goal 
$1/%.o: %.cu 
    $(CC) $(INCLUDES) -c $$< -o [email protected] 
endef 

.PHONY: all checkdirs clean 

all: checkdirs build/lem 

build/lem: $(OBJ) 
    $(LD) $^ -o [email protected] 


checkdirs: $(BUILD_DIR) 

$(BUILD_DIR): 
    @mkdir -p [email protected] 

clean: 
    @rm -rf build 

$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir)))) 

Любые идеи?

UPDATE: Вот полный выход консоли от запуска сделать

nvcc FA_kernels/FA_SFD.cu FA_kernels/partition.cu FA_kernels/contribA.cu FA_kernels/parallel-SFD-List.cu FD_kernels/SFD.cu FD_kernels/flow_routines.cu FD_kernels/floodingDriver.cu FD_kernels/watershed.cu MEM_kernels/memory_dev.cu MEM_kernels/Data.cu MEM_kernels/MapInfo.cu MEM_kernels/memory.cu MOD_kernels/erosion.cu MOD_kernels/eroincidep.cu MOD_kernels/updates.cu MOD_kernels/runoffweight.cu MOD_kernels/depo-List.cu lem.cu -o build/lem 
FA_kernels/FA_SFD.cu:2:20: fatal error: FA_SFD.h: No such file or directory 
#include "FA_SFD.h" 
        ^
compilation terminated. 
Makefile:24: recipe for target 'build/lem' failed 
make: *** [build/lem] Error 1 
+0

Вставить вызов компилятора, как он напечатан в оболочке. – user657267

+0

@ user657267 см. Обновление – JC2188

+0

Было бы хорошо показать нам, как вы написали инструкцию 'include'. –

ответ

3

Из вашего выхода, по-видимому, patsubst в OBJ не был успешным на всех. От того, как вы определяете SRC, я предполагаю, что makefile находится непосредственно под src/, то вы должны изменить src/%.cu к %.cu в определении OBJ как таковой:

OBJ  := $(patsubst %.cu,build/%.o,$(SRC)) 

Кроме того, если я вас правильно понимаю, вы пытаетесь создать структура папки под build/, которая идентична структуре папок под src/. Так, например, /src/abc.cu будет генерировать /src/build/abc.o, то вам не нужно определить функции, чтобы получить эти правила, просто сделать:

build/%.o: %.cu 
    $(CC) $(INCLUDES) -c $< -o [email protected] 

и вы хорошо идти.

Если вы хотите создать build/ на уровне src/. т.е. XXX/src/abc.cu ->XXX/build/abc.o. Затем просто замените все вхождения build в ваш файл с ../build.

Если вы предпочитаете ставить Makefile на том же уровне, что и src/, то вы должны отредактировать SRC, чтобы отразить это:

SRC  := $(foreach sdir,$(SRC_DIR),$(wildcard src/$(sdir)/*.cpp)) 

и изменить цель:

build/%.o: src/%.cpp 
    $(CC) $(INCLUDES) -c $< -o [email protected] 

Теперь вы можете безопасно удалите vapth ... и последнюю строку $foreach в своем файле.

EDIT: Это будет выглядеть ваш make-файл.Я не могу проверить это прямо сейчас, поэтому в нем могут быть некоторые ошибки, но, надеюсь, это заставляет вас понять общую идею.

CC  := nvcc 
LD  := nvcc 

MODULES := FA_kernels FD_kernels MEM_kernels MOD_kernels . 
SRC_DIR := $(MODULES) 
BUILD_DIR := $(addprefix build/,$(MODULES)) 

SRC  := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cu)) 
OBJ  := $(patsubst %.cu,build/%.o,$(SRC)) 
INCLUDES := $(addprefix -I,headers) 

# vpath %.cu $(SRC_DIR) 

#define make-goal 
build/%.o: %.cu 
    $(CC) $(INCLUDES) -c $< -o [email protected] 
#endef 

.PHONY: all checkdirs clean 

all: checkdirs build/lem 

build/lem: $(OBJ) 
    $(LD) $^ -o [email protected] 


checkdirs: $(BUILD_DIR) 

$(BUILD_DIR): 
    @mkdir -p [email protected] 

clean: 
    @rm -rf build 

#$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir)))) 
+0

Спасибо, я удалил src/из подстановки пути и теперь работает (или, по крайней мере, неудачно в ожидании). Мое намерение состоит в том, чтобы иметь следующий структурный проект/*. Cu, project/FA_kernels/*. Cu, project/build/*. Cu, project/build/FA_kernels/*. Cu и т. Д. Я не совсем понимаю ваши предложения по изменения, вы были бы настолько добры, чтобы опубликовать полный макияж с предложенными вами изменениями, чтобы я мог лучше вас понять? Благодарю. – JC2188

+0

Извините, мне нужно было удалить src/из подстановки пути, но то, о чем я спрашивал, было то, что бы мой make-файл выглядел, если бы я реализовал ваши предложения «вам не нужно определять функции для получения этих правил, просто выполните : build /%. O:% .cu $ (CC) $ (ВКЛЮЧАЕТ) -c $ <-o $ @ " – JC2188

+0

ах, только что видел то, что вы закомментировали – JC2188

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