【问题标题】:makefile for C++/CUDA projectC++/CUDA 项目的生成文件
【发布时间】:2012-01-22 11:29:04
【问题描述】:

我在这里阅读了几乎所有关于 CUDA、C++ 和 makefile 的问题,但仍然无法解决我的问题。

我的项目的src/ 目录中有一些.cpp 文件和一些.cu 文件(以及.h.cuh),我想用makefile 构建我的应用程序。

我尝试过这样做:

SRC_DIR   = src
OBJ_DIR   = obj

CPP_FILES = $(wildcard $(SRC_DIR)/*.cpp)
CU_FILES  = $(wildcard $(SRC_DIR)/*.cu)

H_FILES   = $(wildcard $(SRC_DIR)/*.h)
CUH_FILES = $(wildcard $(SRC_DIR)/*.cuh)

OBJ_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.o)))
CUO_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(CU_FILES:.cu=.cu.o)))

$(TARGET) : $(OBJ_FILES) $(CUO_FILES)
    $(LD) $(LDFLAGS) $(LIB_CUDA) -o $@ $?

$(CUO_FILES) : $(CU_FILES) $(CUH_FILES)
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o $@ $<

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(H_FILES)
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o $@ $<

在我得到第二个 .cu 文件之前一切正常。 然后我尝试了:

<... previous part stays the same ...>
OBJS =  $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(notdir $(CPP_FILES)))
OBJS += $(patsubst %.cu,$(OBJ_DIR)/%.cu.o,$(notdir $(CU_FILES)))

$(TARGET) : $(OBJS)
    $(LD) $(LDFLAGS) $(LIB_CUDA) -o $@ $?

$(OBJ_DIR)/%.cu.o : $(SRC_DIR)/%.cu $(CUH_FILES)
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o $@ $<

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(H_FILES)
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o $@ $<

但是 ma​​ke 现在无法弄清楚如何制作任何 .cu.o 文件。 我应该如何修改这个东西来构建我的应用程序?

提前致谢!

Upd - 使用第二个 makefile 的 make 输出:

/usr/local/cuda/bin/nvcc  -I/usr/local/cuda/include -c -o obj/main.o src/main.cpp
/usr/local/cuda/bin/nvcc  -I/usr/local/cuda/include -c -o obj/util.o src/util.cpp
make: *** No rule to make target `obj/thrust.cu.o', needed by `DCG'.  Stop.

项目文件(src/):

  • main.cpp
  • utils.h
  • util.cpp
  • thrust.cu
  • thrust.cuh
  • cuda-utils.cu
  • cuda-utils.cuh

【问题讨论】:

  • 您似乎在第 5 行没有标签,这是这里还是您的 Makefile 中的拼写错误?
  • 我猜这是一个错字。我觉得现在看起来不错。

标签: cuda makefile


【解决方案1】:

您的 Makefile 中有一个语法错误,您没有显示,或者您的项目布局与您描述的不一样。如果我采用你的 Makefile 的这个模型:

TARGET    = nothing
SRC_DIR   = src
OBJ_DIR   = obj

CPP_FILES = $(wildcard $(SRC_DIR)/*.cpp)
CU_FILES  = $(wildcard $(SRC_DIR)/*.cu)

H_FILES   = $(wildcard $(SRC_DIR)/*.h)
CUH_FILES = $(wildcard $(SRC_DIR)/*.cuh)

OBJ_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.o)))
CUO_FILES = $(addprefix $(OBJ_DIR)/,$(notdir $(CU_FILES:.cu=.

OBJS =  $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(notdir $(CPP_FILES)))
OBJS += $(patsubst %.cu,$(OBJ_DIR)/%.cu.o,$(notdir $(CU_FILES)))

$(TARGET) : $(OBJS)
    echo "linking rule : " -o $@ $?

$(OBJ_DIR)/%.cu.o : $(SRC_DIR)/%.cu $(CUH_FILES)
    echo ".cu.o rule : " $@ $<
    touch $@

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(H_FILES)
    echo ".o rule : " $@ $<
    touch $@

然后我根据你的描述制作一个模型:

$ mkdir src
$ mkdir obj
$ touch  src/main.cpp
$ touch  src/cuda-utils.cuh
$ touch  src/thrust.cu
$ touch  src/cuda-utils.cu
$ touch  src/util.cpp
$ touch  src/main.cpp

$ ls
Makefile    obj     src

$ ls src
cuda-utils.cu   cuda-utils.cuh  main.cpp    thrust.cu   util.cpp

$ ls obj

然后我运行 make:

$ make
echo ".o rule : " obj/main.o src/main.cpp
.o rule :  obj/main.o src/main.cpp
touch obj/main.o
echo ".o rule : " obj/util.o src/util.cpp
.o rule :  obj/util.o src/util.cpp
touch obj/util.o
echo ".cu.o rule : " obj/cuda-utils.cu.o src/cuda-utils.cu
.cu.o rule :  obj/cuda-utils.cu.o src/cuda-utils.cu
touch obj/cuda-utils.cu.o
echo ".cu.o rule : " obj/thrust.cu.o src/thrust.cu
.cu.o rule :  obj/thrust.cu.o src/thrust.cu
touch obj/thrust.cu.o
echo "linking rule : " -o nothing obj/main.o obj/util.o obj/cuda-utils.cu.o obj/thrust.cu.o
linking rule :  -o nothing obj/main.o obj/util.o obj/cuda-utils.cu.o obj/thrust.cu.o

$ ls obj
cuda-utils.cu.o main.o      thrust.cu.o util.o

我得到了预期的结果。因此,如果您遇到问题,它不是来自您在问题中发布的内容(在修复了原始版本中的几个“错字”之后)。

【讨论】:

  • 你是对的 - 它是“cu.o”之前的点。非常感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2012-09-03
  • 2012-11-03
相关资源
最近更新 更多