CUDA链接错误:未解析外部,但在*.cu文件中指定了外部

CUDA链接错误:未解析外部,但在*.cu文件中指定了外部,cuda,gpu,Cuda,Gpu,使用Cuda 5.0,VS2010 这个项目在VS2012中编译和链接很好,但是VS2012不支持Nsight调试,所以我也在VS2010中开发。因此,我有一个VS2010项目文件,但使用相同的源代码文件(.h、.cpp、.cu、.cuh) VS2010 build可以很好地编译所有内容,但链接报告错误与未解决的外部错误: Generating Code... 1>videoFuncUnThread.obj : error LNK2019: unresolved external sym

使用Cuda 5.0,VS2010

这个项目在VS2012中编译和链接很好,但是VS2012不支持Nsight调试,所以我也在VS2010中开发。因此,我有一个VS2010项目文件,但使用相同的源代码文件(.h、.cpp、.cu、.cuh)

VS2010 build可以很好地编译所有内容,但链接报告错误与未解决的外部错误:

 Generating Code...
1>videoFuncUnThread.obj : error LNK2019: unresolved external symbol _runKernel referenced in function "void __cdecl videoFuncUnThread(int,bool,unsigned int * const)" (?videoFuncUnThread@@YAXH_NQAI@Z)
1>D:\StrApp\Viper1B_10\Viper1B_10\Debug\Viper1B_10.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.
1>
缺少的符号runKernel是调用设备端模块(驻留在PTX文件中)的主机端模块

当我搜索runKernel的所有事件时,我得到3行:

filter.cu(127):                     extern "C" CUresult runKernel (int numFrames,     cudaStream_t stream, bool firstBatch, int* searchLimit) { ... } // module code 
videofuncunthread.cpp(28): extern "C" CUresult runKernel(int numFrames, cudaStream_t stream,  bool firstBatch,  int* search);  // 
videofuncunthread.cpp(137): CUresult resultKernel = runKernel( NinBatch, gStream, firstBatch, (int *)searchLimit);
由于“filter.cu”进行编译,这意味着调用行(137)与原型声明(28)一致;您还可以看到filter.cu中的定义与原型相同

最后,我注意到我已成功编译、链接和运行VS2010上cuda 5.0示例的示例。我已验证我在两个项目中使用相同的cuda生成规则,并且我的项目和cuda示例项目之间的项目属性相同

如果您能提供任何见解或建议,我们将不胜感激


谢谢

您确定VS2010正在生成并链接您的CUDA代码吗?有关设置VS2010的说明,请参阅,特别是启用CUDA生成自定义。另外请注意,如果在生成自定义之前添加了
.cu
文件,则需要将
.cu
文件的类型设置为
CUDA C/C++
(右键单击文件、属性、设置项目类型)


一个快速检查是对
.cu
文件进行更改,并确保它正在重新编译。

返回并将警告设置为3级,以防我丢失一些警告。没有更改,就没有警告。
int*search
(由videofuncunthread.cpp(28)请求)和
int*searchLimit
(由filter.cu(127)发布))彼此不同意。@RobertCrovella:这不重要。只有类型重要:两者都是int-ptr。本地名称是内部使用的。请注意,我说过我已经在Nvidia演示项目上成功地使用了VS 2010。我确实仔细检查了构建自定义,并单独编译了所有组件。目前我已经完成了注释掉了最后一个参数[int-pointer],它确实链接了That way。因此,在Nvidia和将数组传递给主机模块时出现了一些问题