0

我是 cuda 编码的新手,(并且在 c++ 方面没有大量经验)所以我一直在阅读以尝试找到解决此问题的方法,但通常不了解人们尝试和解释的内容,并且还没有得到它在职的。

基本上,我有一个 .cu 文件,其中包含两件事:

template <class ModelType>
__global__ void Stepkernel(ModelType *particles)

和:

template <class ModelType>
void runTest(ModelType *particles)

然后我有一个头文件,SamplerI.h,我没有写,但我试图包含对上面的 void 函数的调用,所以,在我拥有的所有#includes 之下:

template <class ModelType>
void runTest(ModelType *particles);

然后稍后在标题中有一个函数,我在其中包含了对上述内容的调用。

头文件和相关文件在库 libdnest 中编译,我使用 nvcc -c step.cu 编译 .cu 文件,然后链接:

g++ -o main main.cpp step.o -ldnest

现在,如果模板不存在(即我只有一个没有提及 ModelType 的 void 函数),所有这一切都很好,它会编译并运行,但是一旦我尝试包含模板,我就会得到以下编译错误:

../../include/SamplerImpl.h: In member function ‘bool       DNest3::Sampler<ModelType>::step() [with ModelType = Banana]’:
../../include/SamplerImpl.h:121:   instantiated from ‘void DNest3::Sampler<ModelType>::run() [with ModelType = Banana]’
main.cpp:37:   instantiated from here
../../include/SamplerImpl.h:159: error: no matching function for call to     ‘runTest(Banana*)’

而且我不知道该怎么做才能尝试修复它...

有没有人有任何想法?如果我解释得不够好,请告诉我,我会尝试包含更多信息,我真的不知道什么是重要的。

干杯林德利

4

1 回答 1

1

您需要在编译器实例化它的同一个源文件中有模板。

请注意,C++11 引入了“extern”,但并非所有编译器都支持这些。

于 2013-02-28T21:12:19.950 回答