2012-01-22 87 views
3

我已閱讀幾乎所有關於CUDA,C++ & makefiles的問題,但仍無法解決我的問題。用於C++/CUDA項目的makefile

我有一些.cpp文件&內src/目錄我的項目的一些.cu文件(連同.h & .cuh),我想我的建立與應用程序生成文件。

我試圖做這種方式:

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 [email protected] $? 

$(CUO_FILES) : $(CU_FILES) $(CUH_FILES) 
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o [email protected] $< 

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(H_FILES) 
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o [email protected] $< 

而且它是確定,直到我有一個第二.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 [email protected] $? 

$(OBJ_DIR)/%.cu.o : $(SRC_DIR)/%.cu $(CUH_FILES) 
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o [email protected] $< 

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(H_FILES) 
    $(NVCC) $(NVCCFLAGS) $(INCLUDES) -c -o [email protected] $< 

使無法弄清楚如何使任何.cu.o文件的現在。 我應該如何修改這個東西來構建我的應用程序?

在此先感謝!

UPD - 與第二makefile文件做出的輸出:

/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
+0

您似乎沒有第5行的選項卡,這是否是您的Makefile中的拼寫錯誤? –

+0

我想這是一個錯字。我認爲現在看起來很好。 – Eralde

回答

4

無論你在你的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 [email protected] $? 

$(OBJ_DIR)/%.cu.o : $(SRC_DIR)/%.cu $(CUH_FILES) 
    echo ".cu.o rule : " [email protected] $< 
    touch [email protected] 

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(H_FILES) 
    echo ".o rule : " [email protected] $< 
    touch [email protected] 

,然後我讓你已經描述了一個模型:

$ 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 

我得到正是預期的。所以如果你遇到問題,它不是來自你在問題中發佈的內容(在原始版本中的幾個「拼寫錯誤」被修復之後)。

+0

你說得對 - 這是「cu.o」之前的點。非常感謝你的努力。 – Eralde

+0

我將在發佈之前仔細檢查我的進一步問題... – Eralde