这是我第一次尝试创建一个makefile(这是一个学生项目)。 首先,我有两个不同的来源: - 在src文件夹中的convolve.cu和main.cpp。 一个cuda标题: - 在include文件夹中的convolve.cuh。 我为futur .o
创建了一个obj文件夹现在我提供每个文件的部分内容:
main.cpp:
#include "CImg.h"
#include "../include/convolve.cuh"
using namespace cimg_library;
int main(){
CImg<float> var1("/*path*/");
CImg<float> var2("/*path2*/");
convolve(&var1,&var2);
//some code
}
convolve.cu:
#include "CImg.h"
#include "cuda.h"
using namespace cimg_library;
__constant__ filter[N][M];
__global__ void kernel(/*some arg*/){
//some code
}
__host__ void convolve(/*some arg*/){
//some code
}
convolve.cuh:
#ifndef CONVOLVE_H
#define CONVOLVE_H
#define N /*value*/
#define M /*value*/
extern __constant__ filter[N][M];
extern __host__ void convolve(CImg<float>&,const CImg<float>&);
extern __global__ void kernel(/*some arg*/);
#endif //CONVOLVE_H
cuda.h不在默认路径中,但是在以下路径中:
/usr/local/cuda-9.0/include
并需要这些库:-lX11 -lpthread -lcudart
位于那里:/usr/local/cuda-9.0/lib64
通过阅读互联网上的一些讲座,我通过这个makefile,我把它放在main.cpp旁边的src文件夹中:
makefile:
1 CC=nvcc
2 IDIR =../include
3 special_IDIR = /usr/local/cuda-9.0/include
4 LDIR = /usr/local/cuda-9.0/lib64
5 CFLAGS=-I$(special_IDIR) -L$(LDIR)
6
7 LIBS = -lX11 -lpthread -lcudart
8 ODIR = ../obj
9
10
11 _DEPS = convolve.cuh
12 DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
13
14 _OBJ = main.o convolve.o
15 OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
16
17 $(ODIR)/%.o: %.cpp
18 $(CC) -c -o $@ $< $(CFLAGS)
19
20 $(ODIR)/%.o: %.cu $(DEPS)
21 $(CC) -c -o $@ $< $(CFLAGS)
22
23 all: $(OBJ)
24 $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
25
26
27 .PHONY: clean
28
29 clean:
30 rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
当我致电make all
时,我遇到了两种不同的错误。
一个来自我如何编译&#34; cuda代码&#34; :error: ‘__host__’ does not name a type
并为__global__
和__constant__
个实例带来同样的问题。
当我使用nvcc编译器时,在编译期间不应该知道那些定义?我必须误解如何编译cuda内核...
第二个错误告诉我../obj/main.o
目标没有规则,all
是必需的。
我没有找到问题。根据我现在所理解的,这条规则不应该用以下那些线来做? :
17 $(ODIR)/%.o: %.cpp $(DEPS)
18 $(CC) -c -o $@ $< $(CFLAGS)
谢谢你的时间!
编辑:我想我发现了第一个错误的来源,但不知道如何纠正错误。
在我的main.cpp
文件中,我致电convolve.cuh
,其中包含__global__
等等。我用-c
选项编译它。但是,如果我尝试使用-x cu
选项,那么我遇到了一些CImg声明的问题(例如var1和var2)我进入main.cpp
并且__global__
没有问题等等。事情。