当尝试编译包含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。
答案 0 :(得分:0)
基于这些评论,这似乎是C风格链接和C ++风格链接之间的不匹配(也可能从未解决的符号本身 - 似乎不是mangled)中看出来。 / p>
,
使用C ++风格的编译和链接。 C风格的功能可以容纳,但需要特殊处理,涵盖in many places here on the CUDA tag和其他地方,所以我不会在这里重复。
默认情况下,许多编译器(显然包括此处的主机编译器)将以nvcc
结尾的文件名视为隐式指定C样式链接。因此,OP的源文件(launch.c)中的请求函数无法针对项目中其他位置提供C ++样式链接点的提供程序进行解析。
在这种情况下,一个可能的解决方案是将.c
重命名为launch.c
,它转换为整个项目的C ++样式链接,从而实现一致性。