Visual Studio与Cuda的链接问题

6
我正在使用nVidia的CUDA C进行编程。我使用Visual Studio 2008作为开发环境,但在链接时遇到了一些麻烦。请问是否有人知道如何解决这个问题或者曾经遇到过同样的问题并能够提供解决方案。
我的程序由3个文件组成。一个头文件(stuff.h),一个C源文件(stuff.c)和一个CUDA C文件(main.cu)。现在,stuff.h/stuff.c定义/实现了一些辅助函数,我从main.cu中调用这些函数。
我正在使用Visual Studio 2008和nVidia的GPU Computing SDK中的Cuda.rules,所有内容都可以编译通过,但是当将所有文件链接在一起时,它失败了。似乎所有在stuff.h中定义(并在stuff.c中实现)的函数都没有正确地链接在一起,因为它们被标记为“未解析的外部符号”。
可能的原因是什么?我该如何解决这个问题?
好的,我已经成功将所有内容编译了。看起来我所需要做的就是将stuff实现文件的扩展名从.c更改为.cpp(这意味着编译为C++可以工作,而编译为C则不行!)。
这可能是什么原因?我宁愿将所有内容保留为.c而不是.cpp(因为这确实是C代码...)。
有什么建议吗?
2个回答

2

主文件main.cu由nvcc处理,默认情况下,它是一个C++编译器(实际上它是基于底层CUDA编译器和默认的MS编译器cl.exe的包装器)。因此,它正在寻找具有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"
}

谢谢帮忙。我已经让它工作了。有没有办法让 .cu 文件编译为 C 文件而不是 C++ 文件呢?谢谢。 - user400055
你可以尝试使用--host-compilation=c选项,但请注意这篇文章中的注意事项:http://forums.nvidia.com/index.php?showtopic=101609。通常我更喜欢将我的`main`函数和其他所有内容放在标准的C/C++文件中,然后只在CU文件中放置内核和包装器。许多Thrust的东西也需要放到CU文件中... - Tom

0

有一个使用CUDA将图像转换为灰度表示的VS 2005项目在这里。它使用OpenCV。如果您已经安装了它,那么应该非常简单。

但是,即使您没有安装OpenCV并且不想编译应用程序,VS 2008也可以转换和打开此项目,您将能够看到如何从C / C ++代码中分离CUDA源代码以及如何正确配置项目属性。

我还应该指出这个很棒的主题:

如何在Visual Studio 2008中启动新的CUDA项目?


谢谢回复,它帮助了我一些,但并没有达到我所希望的目标。实际上,我已经看了一些其他项目,稍微尝试了一下,似乎只要将stuff.c的扩展名更改为stuff.cpp,一切都可以正常工作。这可能是什么原因呢?谢谢。 - user400055
很好!使用.cpp扩展名对你来说是个问题吗?如果你需要帮助理解你的问题,我们需要你编辑你的问题并粘贴VS 2008给出的错误信息。 - karlphillip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接