【问题标题】:cuda file did not link with function defined in C filecuda 文件未与 C 文件中定义的函数链接
【发布时间】:2016-09-24 13:16:24
【问题描述】:

我有一个 cuda 文件 test.cu,其中包含一个文件 cuda.h。

cuda.h 包含 test.cu 中使用的以下函数定义。

extern void check_error(cudaError_t status);

这个函数在 cuda.c 中定义如下:

void check_error(cudaError_t status)
{
    cudaError_t status2 = cudaGetLastError();
    if (status != cudaSuccess)
    {   
        const char *s = cudaGetErrorString(status);
        char buffer[256];
        printf("CUDA Error: %s\n", s);
        assert(0);
        snprintf(buffer, 256, "CUDA Error: %s", s);
        error(buffer);
    } 
    if (status2 != cudaSuccess)
    {   
        const char *s = cudaGetErrorString(status);
        char buffer[256];
        printf("CUDA Error Prev: %s\n", s);
        assert(0);
        snprintf(buffer, 256, "CUDA Error Prev: %s", s);
        error(buffer);
    } 
}

我使用 Visual Studio 2015 进行编译。 cuda.c 被编译为 C 文件。

没有编译错误。但我收到以下链接错误:

test.cu.obj : error LNK2001: unresolved external symbol "void __cdecl check_error(enum cudaError)" (?check_error@@YAXW4cudaError@@@Z)

如何解决这个错误?

这不是Name mangling in CUDA and C++ 的重复,因为它询问相反的顺序。从 Cuda 代码调用 C 函数。在上述问题中,它用于从 C 文件中调用 cuda 函数。

【问题讨论】:

  • @KlasLindbäck:你投票赞成关闭吗?
  • 您是否尝试将扩展名更改为.cpp? CUDA 源代码经过 nvcc AND cc(VS 编译器),可以是 C 或 C++。
  • @DavidLively:现在由答案解决了。
  • @ProEns08 是的,我做到了。这些问题看起来很相似,足以被骗。你不同意吗?

标签: c++ c visual-studio cuda linker


【解决方案1】:

编译 C 时没有名称修改。

当您编译 C++ 时,您需要关闭带有 extern "C" 的声明的名称修饰:

#ifdef __cplusplus
extern "C" {
#endif
    extern void check_error(cudaError_t status);
#ifdef __cplusplus
}
#endif

【讨论】:

  • 它解决了这个问题。显然,cuda 代码被编译为 C 代码。谢谢,+1。
  • 为什么,那么他们需要 C 名称并且不支持 C++ 名称修改?
  • 就我而言,我在 .cu 文件中编译代码(C++/class/templates 等)。我没有在 Visual Studio 中提到 nvcc 编译器。结果,.cu 文件没有被编译,我得到了一个链接器错误。我使用自定义构建选项来解决这个问题。右键单击项目 -> 构建依赖项 -> 构建自定义项 -> 选择 CUDA 目标。
猜你喜欢
  • 2020-10-21
  • 2014-09-02
  • 2017-04-12
  • 1970-01-01
  • 2011-01-24
  • 2015-01-13
  • 1970-01-01
  • 2020-10-03
  • 2013-06-15
相关资源
最近更新 更多