我的项目具有以下目录结构:
其中* .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))))
答案 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))))