我正在使用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实现文件的扩展名从.c更改为.cpp(意味着编译为c ++,而编译为c则不行!)。
可能导致这种情况的原因是什么?我宁愿将所有内容保存为.c而不是.cpp(因为这实际上是C代码......
任何指针?
答案 0 :(得分:3)
main.cu文件正由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
或者你可以在main.cu中包含stuff.h:
// in main.cu
extern "C"
{
#include "stuff.h"
}
答案 1 :(得分:1)