GNU Makefile生成所有目标文件均使用同一源文件的问题求助
问题根因
你当前写的规则$(CUO_FILES): $(CU_FILES) $(CUH_FILES)是把所有.cu源文件都设置为了每一个.obj目标文件的依赖,按照Make的自动变量规则,$<永远取依赖列表的第一个条目,自然所有目标文件都会用同一个源文件编译。
解决方法
使用GNU Make的静态模式规则即可匹配每个目标文件对应的源文件,修改后的完整Makefile如下:
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 $@ # 静态模式规则:每个obj对应同名的cu源文件 $(CUO_FILES): $(OBJ_DIR)/%.obj: $(SRC_DIR)/%.cu $(CUH_FILES) @mkdir -p $(OBJ_DIR) $(NVCC) -I$(INC_DIR) -dc $< -o $@ # 可选:添加clean规则方便清理 .PHONY: clean clean: rm -rf $(OBJ_DIR) $(LIB)
核心修改说明
- 静态模式规则
$(CUO_FILES): $(OBJ_DIR)/%.obj: $(SRC_DIR)/%.cu的作用是,给CUO_FILES列表里的每个目标文件,匹配对应名称的.cu源文件,此时$<会自动取当前目标对应的单个源文件,不会再出现只取第一个源的问题 - 新增
-I$(INC_DIR)编译参数,确保编译器能找到include目录下的.cuh头文件 - 新增
@mkdir -p $(OBJ_DIR)逻辑,避免首次编译时obj目录不存在导致的报错 - 可选添加
clean规则,执行make clean即可一键清理编译产物
内容的提问来源于stack exchange,提问作者VSB
相关产品推荐
相关产品推荐

