函数在.cu中声明的.h中定义
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数在.cu中声明的.h中定义相关的知识,希望对你有一定的参考价值。
我在三个文件夹中分割了一个项目:src,include,obj我正在使用CImg.h和cuda.h库。我声明void convolve(cimg_library::CImg<float>&, cimg_library::CImg<float> const &);
in convolve.h并在convolve.cu中定义它
我的文件 :
main.cpp:
#include "CImg.h"
#include "../include/convolve.h"
using namespace cimg_library;
int main(){
CImg<float> var1("/*path*/");
CImg<float> var2("/*path2*/");
convolve(var1,var2);
//some code
}
convolve.h:
1 #ifndef CONVOLVE_H
2 #define CONVOLVE_H
//some define
10 void convolve(cimg_library::CImg<float>&, cimg_library::CImg<float> const &);
11 #endif //CONVOLVE_H
convolve.粗 :
1 void convolve(CImg<float>& img, const CImg<float>& kernel){
//some code
24 kernel<<<dimGrid,dimBlocks>>>(/*some arg*/);
}
和我的新makefile:
1 CC=nvcc
2 CX=g++
3 IDIR =../include
4 special_IDIR = /usr/local/cuda-9.0/include
5 LDIR = /usr/local/cuda-9.0/lib64
6 CFLAGS=-I$(special_IDIR) -L$(LDIR)
7
8 LIBS = -lX11 -lpthread -lcudart
9 ODIR = ../obj
10
11
12 _DEPS = convolve.h kernel.cuh
13 DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
14
15 _OBJ = main.o convolve.o kernel.o
16 OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
17
18 $(ODIR)/%.o: %.cpp $(DEPS)
19 $(CX) -x c++ -o $@ $< $(CFLAGS) $(LIBS)
20
21 $(ODIR)/%.o: %.cu $(DEPS)
22 $(CC) -cu -o $@ $< $(CFLAGS)
23
24 all: $(OBJ)
25 $(CC) -o $@ $^ $(CFLAGS)
26
27
28 .PHONY: clean
29
30 clean:
31 rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
这是我的问题:它说对void convolve(cimg_library::CImg<float>&, cimg_library::CImg<float> const &)
的引用是未定义的。
我想这是因为我从未明确地告诉编译器卷积的定义是在convolve.cu中。但我没有找到如何正确地建立这个链接。
谢谢你的帮助 !
- 请不要使用行号发布代码(或Makefile内容)。它通常会妨碍它。
- 这里的编译过程遵循编译...链接过程。第一阶段是编译阶段,你应该在这个阶段使用
-c
用于g++
和nvcc
(即两种类型的Makefile目标) nvcc
没有-cu
选项。我想也许你的意思是-x cu
我还删除了函数调用中的&符号。
这是一个简化的例子,基于你展示的内容,主要删除CImg
的东西和一些其他不必要的项目:
$ cat main.cpp
#include "convolve.h"
int main(){
int var1 = 0;
int var2 = 1;
convolve(var1, var2);
}
$ cat convolve.h
void convolve(int &, int &);
$ cat convolve.cu
#include "convolve.h"
__global__ void kernel(){};
void convolve(int & i1, int & i2){
kernel<<<1,1>>>();
}
$ cat Makefile
CC=nvcc
CX=g++
IDIR = .
special_IDIR = /usr/local/cuda-9.1/include
LDIR = /usr/local/cuda-9.1/lib64
CFLAGS=-I$(special_IDIR) -L$(LDIR)
LIBS =
ODIR = .
_DEPS = convolve.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = main.o convolve.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.cu $(DEPS)
$(CC) -c -x cu -o $@ $< $(CFLAGS)
$(ODIR)/%.o: %.cpp $(DEPS)
$(CX) -c -x c++ -o $@ $< $(CFLAGS) $(LIBS)
all: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
$ make clean
rm -f ./*.o *~ core /*~
$ make
g++ -c -x c++ -o main.o main.cpp -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
nvcc -c -x cu -o convolve.o convolve.cu -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
nvcc -o all main.o convolve.o -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
$
如果你的设置中有CUDA 9.0,请在上面的Makefile中将cuda-9.1
的实例更改为cuda-9.0
。但是,编译命令并不真正需要链接器库(-L
)。当我们在这里与nvcc
链接时,也没有必要通过引用CUDA包含的-I
和-L
开关以及作为工具包一部分的CUDA库。 nvcc
已经知道如何找到那些。
Makefile可能有任意数量的额外建议或调整,例如-x cu
和-x c++
开关可能是不必要的(至少它们对我的简化示例来说是不必要的)但我的目标不是创建完美的Makefile,而是给出您是一个路线图,可以解决您目前正在目睹的问题。
以上是关于函数在.cu中声明的.h中定义的主要内容,如果未能解决你的问题,请参考以下文章