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 rule 说 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))
文件结构:
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 rule 说 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))