2016-09-14 2 views
0

내 프로젝트는 다음 디렉토리 구조가 있습니다만들기 : * .H 그런 파일이 없습니다 또는 디렉토리

  • main.cu
  • FA_kernels/* CU
  • FD_kernels/* CU
  • MEM_kernels을.. /*.cu
  • MOD_kernels/*. CU
  • 헤더/*. H
,

여기서 * .extension은 해당 확장자를 가진 파일을 의미합니다. makefile이 올바르게 작동하는 것처럼 보일 수 없습니다. 내가 갖는 오류 : -I 헤더하여 검색을위한 헤더 디렉토리가 사용할 수 있도록 컴파일러에 지정하는

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

내 의도였다. 분명히 이것은 효과가 없습니다. 다음은 메이크 파일입니다.

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 :는 여기에 전혀 성공하지 분명히 patsubstOBJ에 출력에서 ​​

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

을 만들 실행에서 전체 콘솔 출력됩니다. 당신은 SRC를 정의하는 방법에서, 나는 다음과 같은 OBJ의 정의에 %.cusrc/%.cu을 변경해야합니다, makefile 바로 아래 src/ 가정 :

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

을 또한, 내가 제대로 이해한다면, 당신이 만들려고했다 폴더 구조가 src/ 아래와 동일한 build/ 아래의 폴더 구조. 그래서, 예를 들어, /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입니다. 그런 다음 makefile에있는 build의 모든 항목을 ../build으로 바꾸기 만하면됩니다.

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

과에 대상을 변경 : 당신이 오히려 src/와 같은 수준에서 makefile을 둘 것입니다 경우

, 당신은 그것을 반영하기 위해 SRC을 편집해야 안전하게 지금

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

을 수행 할 수 있습니다 makefile에서 vapth ... 및 마지막 줄 $foreach을 제거하십시오.

편집 : 이것은 당신의 메이크 파일이 어떻게 생겼는지입니다.지금은 테스트 할 수 없으므로 실수가있을 수 있지만 잘하면 일반적인 생각을 이해할 수 있습니다.

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 /를 제거해야했습니다.하지만 제안 사항을 구현하면 내 makefile이 어떻게 생겼는지 물었습니다. "이러한 규칙을 얻기 위해 함수를 정의 할 필요가 없습니다. : build/%. o : % .cu $ (CC) $ (포함됨) -c $ <-o $ @ " – JC2188

+0

아, 주석 처리 한 내용을 보았습니다. – JC2188

관련 문제