Visual Studio与Cuda的链接问题

Ext*_*der 6 linker cuda visual-studio

我正在使用nVidia的CUDA C进行一些编程.我使用Visual Studio 2008作为我的开发环境,我遇到了一些链接的麻烦,我想知道是否有人知道修复它的方法或者有同样的问题并且可以提供一个办法.

我的程序由3个文件组成.1个头文件(stuff.h),1个C源文件(stuff.c)和1个CUDA C文件(main.cu).(名字是假的,但这只是为了说明这一点).

现在stuff.h/stuff.c定义/实现我从main.cu内部调用的一些辅助函数.

我正在使用视觉工作室2008和来自nVidia GPU计算SDK的Cuda.rules,所有内容编译都很好但是......当涉及将所有文件链接在一起时,它失败了.看来,stuff.h中定义的所有函数(以及在stuff.c中实现的)都没有被正确链接,因为它们被标记为"未解析的外部符号".

可能的原因是什么?我该如何解决这个问题?

非常感谢,

ExtremeCoder


好的,所以我设法让它全部编译.似乎我所要做的就是将实现文件的扩展名从.c更改为.cpp(意味着编译为c ++,而编译为c则不行!).

可能是什么导致了这个?我宁愿将所有内容保存为.c而不是.cpp(因为这实际上是C代码...

有什么指针吗?

Tom*_*Tom 2

main.cu 文件由 nvcc 处理,默认情况下,nvcc 是一个 C++ 编译器(实际上它是底层 CUDA 编译器和 cl.exe(默认的 MS 编译器)的包装器)。因此,它正在寻找具有 C++ 绑定的函数,而通过将它们编译为 C,您将获得 C 绑定。

如果您想将代码保留为 C,那么您可以编辑 stuff.h 将函数声明为 extern "C":

/* in stuff.h */
if defined(__cplusplus)
    extern "C"
    {
#endif
/* ... your declarations ... */
if defined(__cplusplus)
    }
#endif
Run Code Online (Sandbox Code Playgroud)

或者你可以将 stuff.h 包含在 main.cu 中:

// in main.cu
extern "C"
{
#include "stuff.h"
}
Run Code Online (Sandbox Code Playgroud)