Visual studio 2015 未解析的外部符号\u并行\u管理器在函数\u main中引用

Visual studio 2015 未解析的外部符号\u并行\u管理器在函数\u main中引用,visual-studio-2015,cuda,Visual Studio 2015,Cuda,当试图编译包含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); #endi

当试图编译包含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这个特定错误的参考资料是,但是已经应用了解决方案,包括所有库

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

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);
}
错误列表还包含以下内容:

LNK2019 unresolved external symbol _parallel_function referenced in function _main

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

根据注释,这似乎是C风格链接和C++风格链接之间的不匹配(也可能从未解析的符号本身可以看出,这似乎不匹配)

nvcc
使用C++风格的编译和链接。C风格的功能可以适应,但需要特殊的处理,这在其他地方都有介绍,所以这里不再重复

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


本例中的一个可能的解决方案是将代码> >启动.c>代码>改为代码>启动.CPP < /C> >,它转换为C++样式链接,从而导致整个项目的一致性。有一些文件需要添加到此项目中,其中包含

parallel\u manager
的定义,或者需要将项目与包含该函数编译版本的对象或库相链接。仅仅包含提供函数声明的头文件不足以避免链接时间错误。例如,可能存在一个名为
parallel_functions.cu
的文件,该文件当前不属于项目的一部分,但需要属于项目的一部分。parallel_functions.cu已经是项目的一部分。因此,可能需要查看一个完整的示例来演示这一点。您应该能够将其拆分为包含此头文件、头文件本身和parallel_functions.cu文件的文件。我敢肯定,您可能有一些windows VS项目设置也会产生干扰。在这种情况下,提供显示此错误的完整VS控制台输出以及导致此错误的所有编译命令可能有助于将
launch.c
更改为
launch.cpp
。在构建输出中没有证据表明
kernel.cu
实际上是项目的一部分。它没有在任何地方被编译。我还建议不要再使用CUDA构建32位项目。我意识到我遗漏了构建输出的一部分,但这确实解决了编译问题,谢谢。
LNK2019 unresolved external symbol _parallel_function referenced in function _main