【问题标题】:Visual Studio Linking Problem with CudaVisual Studio 与 Cuda 的链接问题
【发布时间】:2011-03-29 23:16:05
【问题描述】:

我正在使用 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 内部调用的辅助函数。

我正在使用 Visual Studio 2008 和来自 nVidia 的 GPU Computing SDK 的 Cuda.rules,一切都可以正常编译,但是......当将所有文件链接在一起时,它会失败。似乎在 stuff.h 中定义的所有函数(并在 stuff.c 中实现)都没有正确链接,因为它们被标记为“未解析的外部符号”。

可能的原因是什么?我该如何解决?

非常感谢,

ExtremeCoder


好的,所以我已经设法编译了所有内容。看来我所要做的就是将 stuff 实现文件的扩展名从 .c 更改为 .cpp(这意味着编译为 c++ 可以,而编译为 c 则不行!)。

这可能是什么原因造成的?我宁愿将所有内容都保留为 .c 而不是 .cpp(因为这实际上是 C 代码...

任何指针?

【问题讨论】:

    标签: visual-studio linker cuda


    【解决方案1】:

    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
    

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

    // in main.cu
    extern "C"
    {
    #include "stuff.h"
    }
    

    【讨论】:

    • 感谢您的帮助。我让它工作了。有没有办法让 .cu 文件编译为 C 文件而不是 C++ 文件呢?谢谢。
    • 您可以尝试--host-compilation=c 选项,但请参阅此帖子以了解警告:forums.nvidia.com/index.php?showtopic=101609。一般来说,我更喜欢将我的 main 函数和其他所有内容保存在标准 C/C++ 文件中,然后在 CU 文件中只包含内核和包装器。很多 Thrust 的东西也需要进入 CU 文件...
    【解决方案2】:

    有一个 VS 2005 项目使用 CUDA 将图像转换为其灰度表示here。不过,它使用OpenCV。如果你已经安装了它应该很简单。

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

    我还应该指出这个伟大的线程:

    How do I start a new CUDA project in Visual Studio 2008?

    【讨论】:

    • 感谢您的回复,它对我的​​帮助更进一步,但没有达到我希望达到的效果。实际上,我已经查看了其他一些项目,有点搞砸了,似乎如果我所做的只是将 stuff.c 的扩展名更改为 stuff.cpp 一切正常。这可能是什么原因造成的?谢谢。
    • 好!使用 .cpp 扩展名对您来说是个问题吗?如果您需要帮助理解您的问题,我们需要您编辑您的问题并粘贴 VS 2008 给您的错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2011-11-05
    • 2012-07-10
    相关资源
    最近更新 更多