You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:18:04