制作:* .h没有这样的文件或目录

时间:2016-09-14 22:27:30

标签: c makefile cuda gnu-make nvcc

我的项目具有以下目录结构:

  • main.cu
  • FA_kernels / *。铜
  • FD_kernels / *。铜
  • MEM_kernels / *。铜
  • MOD_kernels / *。铜
  • 头/ *的.h

其中* .extension表示具有该扩展名的一堆文件。我似乎无法使makefile正常工作。我得到的错误是:

    class Test{
        public void ex() throws Exception{
            //...some code throwing for eg. IllegalAccesException()
        }     
    }

我的意图是为编译器指定-I头文件,从而使头文件目录可供搜索。显然这没有用。这是makefile:

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

有什么想法吗?

UPDATE:以下是运行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 src/%.cu,build/%.o,$(SRC))
INCLUDES  := $(addprefix -I,headers)

vpath %.cu $(SRC_DIR)

define make-goal
$1/%.o: %.cu
    $(CC) $(INCLUDES) -c $$< -o $$@
endef

.PHONY: all checkdirs clean

all: checkdirs build/lem

build/lem: $(OBJ)
    $(LD) $^ -o $@


checkdirs: $(BUILD_DIR)

$(BUILD_DIR):
    @mkdir -p $@

clean:
    @rm -rf build

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

1 个答案:

答案 0 :(得分: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 $@

你很高兴。

如果您希望在与build/相同的级别创建src/。即XXX/src/abc.cu - &gt; XXX/build/abc.o。然后,只需使用build替换makefile中出现的所有../build

如果您希望将makefile放在与src/相同的级别,那么您应该编辑SRC以反映:

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

并将目标更改为:

build/%.o: src/%.cpp
    $(CC) $(INCLUDES) -c $< -o $@

现在,您可以安全地删除生成文件中的vapth ...和最后一行$foreach

编辑:这就是你的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 %.cu,build/%.o,$(SRC))
INCLUDES  := $(addprefix -I,headers)

# vpath %.cu $(SRC_DIR) 

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

.PHONY: all checkdirs clean

all: checkdirs build/lem

build/lem: $(OBJ)
    $(LD) $^ -o $@


checkdirs: $(BUILD_DIR)

$(BUILD_DIR):
    @mkdir -p $@

clean:
    @rm -rf build

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