【问题标题】:Unresolved external symbol _parallel_manager referenced in function _main函数 _main 中引用的未解析的外部符号 _parallel_manager
【发布时间】:2017-04-04 19:07:17
【问题描述】:

在尝试编译包含CUDA文件的程序时,我得到一个错误代码LNK2019,但我特别确保在代码的开头包含相关的头文件:

#include "parallel_functions.cuh"

其中完全包括:

#ifndef parallel_functions_cuh
#define parallel_functions_cuh

void
parallel_manager(image_chunk ***image_grid, network_chunk *** network_grid);

#endif

使用较早的程序,我可以很简单地将所有内容包含在一个文件中(这消除了链接器错误),但使用此程序,这将不是一个有效的选项。

我能找到的关于 CUDA 的这个特定错误的唯一参考是 this prior question,但那里的解决方案已经应用,包括所有库。

在由launch.c、kernel.cu和kernel.cuh组成的简单示例项目中也会出现同样的错误。

launch.c:

#include "kernel.cuh"

void main()
{
    parallel_function();
}

kernel.cuh:

#ifndef kernel_cuh
#define kernel_cuh

void parallel_function();

#endif

kernel.cu:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

__global__ void kernel(char *a)
{
    a[threadIdx.x] = threadIdx.x;
}

void parallel_function()
{
    char* data;
    cudaMallocManaged(&data, 256);

    kernel<<<1, 256>>>(data);
    cudaDeviceSynchronize();

    for (int i = 0; i < 256; i++)
    {
        printf("%d ", data[i]);
    }

    cudaFree(data);
}

提供以下构建输出:

1>------ Build started: Project: ErrorProject, Configuration: Debug Win32 ------
1>  launch.c
1>launch.obj : error LNK2019: unresolved external symbol _parallel_function referenced in function _main
1>C:\Error\ErrorProject\Debug\ErrorProject.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

错误列表还包含以下内容:

LNK2019 unresolved external symbol _parallel_function referenced in function _main

构建依赖项使用默认的 CUDA V8.0 目标,包括链接器设置中的工具包依赖项和 cudart.lib。

【问题讨论】:

  • 这是一个链接器错误。有一些文件需要添加到该项目中,其中包含parallel_manager 的定义,否则您需要将项目链接到包含该函数的编译版本的对象或库。仅仅包含提供函数声明的头文件并不足以避免链接时错误。例如,可能有一个名为 parallel_functions.cu 的文件,它当前不是您项目的一部分,但需要。
  • parallel_functions.cu 已经是项目的一部分。
  • 那么可能有必要查看一个完整的示例来说明这一点。您应该能够将其剥离为仅包含此头文件的文件、头文件本身和 parallel_functions.cu 文件。我敢肯定,您也可能有一些干扰的 Windows VS 项目设置。在这种情况下,提供显示此错误的完整 VS 控制台输出以及导致该错误的所有编译命令可能会有所帮助
  • launch.c 更改为launch.cpp。并且构建输出中没有证据表明kernel.cu 实际上是您项目的一部分。它没有在任何地方编译。我还建议不要再使用 CUDA 构建 32 位项目。
  • 我意识到我错过了部分构建输出,但这确实解决了编译问题,谢谢。

标签: visual-studio-2015 cuda


【解决方案1】:

根据 cmets,这似乎是 C 样式链接和 C++ 样式链接之间的不匹配(也可能从未解析符号本身很明显 - 这似乎不是 mangled)。

nvcc 使用 C++ 风格的编译和链接。可以容纳 C 风格的功能,但需要特殊处理,这在 in many places here on the CUDA tag 和其他地方都有介绍,所以我在此不再赘述。

默认情况下,许多编译器(显然包括此处的主机编译器)将以.c 结尾的文件名视为隐式指定 C 样式链接。因此,OP 源文件 (launch.c) 中请求的函数无法针对项目中其他提供 C++ 样式链接点的提供程序进行解析。

在这种情况下,一个可能的解决方案是将 launch.c 重命名为 launch.cpp,这将转换为整个项目的 C++ 样式链接,从而保持一致性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多