我几乎读过有关CUDA,C ++和CUD的所有问题。 makefiles在这里,但仍无法解决我的问题。
我有一些.cpp
个文件&我项目的.cu
目录中的一些src/
文件(以及.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 $@ $<
但 make 无法弄清楚如何制作任何.cu.o
文件。
我应该如何修改这个东西来构建我的应用程序?
提前致谢!
更新 - 使用第二个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 /):
答案 0 :(得分:5)
要么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
我得到了预期的结果。因此,如果您遇到问题,则不是来自您在问题中发布的内容(在原始版本中的几个“拼写错误”修复后)。