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

GNU Makefile uses the same source file for all object files

文件结构:

cpp
|   Makefile
|
|   obj
|___include
|   |   a.cuh
|   |   b.cuh
|   |   c.cuh
|
|___src
|   |   a.cu
|   |   b.cu
|   |   c.cu

我对 GNU make 的经验不多。下面是根据Whosebug上不同的搜索结果写的。 $@ 变量正确地从列表中获取每个目标文件的名称,但是 $< 变量仅获取源文件名列表中的第一项(根据手册,但这就是所有我发现的堆栈溢出答案正在使用 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 $@

意味着每个目标文件 依赖于所有源文件所有头文件

这里你需要的是 pattern ruleobj/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))