【发布时间】: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 位项目。 -
我意识到我错过了部分构建输出,但这确实解决了编译问题,谢谢。