GNU Makefile对所有目标文件使用相同的源文件


文件结构:
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.cuinclude/foo.cuh:

obj/%.obj: src/%.cu include/%.cuh
$(NVCC) -dc $< -o $@

注意,您可以简化CUO_FILES赋值:

CUO_FILES = $(patsubst $(SRC_DIR)/%.cu,$(OBJ_DIR)/%.obj,$(CU_FILES))

最新更新