文件结构:
cpp
| Makefile
|
| obj
|___include
| | a.cuh
| | b.cuh
| | c.cuh
|
|___src
| | a.cu
| | b.cu
| | c.cu
我对GNU make没有太多经验。以下是根据Stackoverflow上不同的搜索结果编写的。$@
变量正确地从列表中获得每个目标文件的名称,然而$<
变量只获得源文件名列表中的第一个项目(根据手册,但这是我发现的所有堆栈溢出答案都使用1,2,3)。
NVCC=nvcc
LIB = lib.dll
SRC_DIR = src
INC_DIR = include
OBJ_DIR = obj
CU_FILES = $(wildcard $(SRC_DIR)/*.cu)
CUH_FILES = $(wildcard $(INC_DIR)/*.cuh)
CUO_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(CU_FILES:.cu=.obj)))
$(LIB): $(CUO_FILES)
$(NVCC) --shared $^ -o $@
$(CUO_FILES): $(CU_FILES) $(CUH_FILES)
$(NVCC) -dc $< -o $@
你写的可能不是你想要的。您的规则:
$(CUO_FILES): $(CU_FILES) $(CUH_FILES)
$(NVCC) -dc $< -o $@
表示每个对象文件依赖于所有源文件ad所有头文件.
这里需要的是一个模式规则,说明obj/foo.obj
依赖于src/foo.cu
和include/foo.cuh
:
obj/%.obj: src/%.cu include/%.cuh
$(NVCC) -dc $< -o $@
注意,您可以简化CUO_FILES
赋值:
CUO_FILES = $(patsubst $(SRC_DIR)/%.cu,$(OBJ_DIR)/%.obj,$(CU_FILES))