智慧的老鸟

一个程序员需要有一棵Gank的心,Dota能培养我。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

现有一纯C的工程,想在里面调用.cu文件的函数。Project里面有一个cppIntegeration的例子,不过这个是在CPP里面调用.cu里面的函数,而且,这个工程在sdk里面,很多头文件,库之类的直接引用,因此,可移植性很差。摸索了几天,终于解决了C工程调用CU文件的问题。一起分享一下~~~

 

新建两个文件,A.cu和A_kernel.cu,其中,A.cu作为调用的接口,A_kernel.cu里面实现的功能函数。

然后,在A.cu-》右键-》属性-》自定义生成步骤-》常规-》命令行,添加如下命令:

"$(CUDA_BIN_PATH)nvcc.exe" -ccbin "$(VCInstallDir)bin" -I"$(NVSDKCUDA_ROOT)commoninc" -I"$(CUDA_INC_PATH)" -I.  --host-compilation C -g -c -m 32 -o "$(InputName).obj" "$(InputDir)$(InputName).cu"

注意,必须加上:--host-compilation,否则,提示,LINK : fatal error LNK1561: 必须定义入口点。另外,必须把SDK和INC的路径加进来,才能在A.cu中include "cutil.h"的这些头文件。

并在开始A.cu头部加上include <A_kernel.cu>。

注意:生成的.obj的路径必须是:"$(InputName).obj",否则,会在编译的时候提示,找不到f.obj。

 

对于A.cu里面的函数f,需如下定义:

  extern "C" void f(){} //定义的时候,必须这样定义,否则,链接的时候提示:无法解析_f。

但是,在C文件里面引用它的时候,必须申明如下:

  extern void f(){};  //注意:如果加上"C"就会报错:错误的字符。

另外,在C工程的  链接器-》输入-》附加依赖项 里面,添加

 cudart.lib cutil32.lib  //必须添加这两个库,否则提示:无法解析的外部符号_cudaConfigureCall@32等错误。

这样,就可以在C文件里面调用 f()了。

问题解决了,可以进行下一步工作了!!!

PS:发现很多人都用blog记载技术问题,很不错的习惯,好记性不如blog之...

 

 

 

posted on 2012-11-12 14:44  智慧的老鸟  阅读(887)  评论(0编辑  收藏  举报