在ubuntu上使用CUDA 5.0和gcc / g ++ 4.6,我在使用模板链接CUDA代码时遇到错误。
cu_array.cu:
#include "cu_array.hpp"
template<class T>
CuArray<T>::CuArray(unsigned int n) {
cudaMalloc(&data,n*sizeof(T));
}
cu_array.hpp:
#pragma once
template<class T>
class CuArray {
public:
CuArray(unsigned int n);
private:
T* data;
};
main.cu:
#include "cu_array.hpp"
int main() {
CuArray<float> a(10);
}
这些与nvcc -c
一起正常编译,但与nvcc cu_array.o main.o
的关联可以undefined reference to CuArray<float>::CuArray(unsigned int)
。如果我将cu_array.cu的内容移动到标题中并且只构建main,它就可以正常使用模板。或者,如果我完全删除模板,代码自然会很好地链接。
我确信这有一个简单的答案。有什么想法吗?
答案 0 :(得分:3)
您没有在定义它的编译单元中实例化该类,因此编译器不会为类成员函数发出任何代码,并且链接失败。这不是CUDA特有的,这种贪婪的实例化方式是g ++使用的编译/链接模型,很多人都被它抓住了。
正如您已经发现的那样,最简单的解决方案是将所有内容都包含在同一个编译单元中,问题就会消失。
否则,如果您在CuArray::CuArray
的底部显式实例化cu_array.cu
,请执行以下操作:
template CuArray<float>::CuArray(unsigned int);
编译器将发出代码否则不会发出代码,并且链接问题将得到修复。您需要为代码中其他地方使用的每种类型实例化每个类函数,以使此方法有效。