gpt4 book ai didi

c++ - 在 CUDA 头 (.cuh) 文件中使用常量内存时出现 LNK2005 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:02 30 4
gpt4 key购买 nike

我有一个 CUDA 头文件 (.cuh),其中包含两个常量 float 组。有两个文件包含此 header ,一个是尝试复制到此常量内存的 CPP 文件,一个是尝试使用此常量内存的 CUDA 文件。所有这三个文件都在一个项目中,该项目应该编译成一个 DLL。

我尝试使用以下代码来简化事情:

obj1.cuh

#pragma once

__constant__ float d_array1[5];
__constant__ float d_array2[5];

obj1.cu

#include "obj1.cuh"

//do random stuff
__global__ void kernel(float * d_array1, float * d_array2) {
int id = threadIdx.x;
float sum = d_array1[i] + d_array2[i];
}

ext.cpp

#include "obj1.cuh"

void function(float * array1, float * array2) {
cudaMemcpyToSymbol(d_array1, array1, sizeof(float)*5);
cudaMemcpyToSymbol(d_array2, array2, sizeof(float)*5);

kernel<<<1,5>>>(d_array1,d_array2);
}

构建失败并输出以下错误:

1>ext.obj : error LNK2005: "float * d_array1" (?d_array1@@3PAMA) already defined in obj1.cu.obj
1>ext.obj : error LNK2005: "float * d_array2" (?d_array2@@3PAMA) already defined in obj1.cu.obj

在你问之前,是的,我曾尝试使用 include guards 而不是 pragma 一次,它仍然输出相同的错误。

包含 obj1.cuh 的保护版本

#ifndef CONSTANTARRAYS
#define CONSTANTARRAYS
__constant__ float d_array1[5];
__constant__ float d_array2[5];
#endif

最佳答案

问题正是链接器告诉您的:变量定义在多个 translation units 中.

当预处理器包含头文件时,它会将头文件中的文本直接粘贴到 #include 指令所在的位置,这意味着生成的两个目标文件都将具有变量的定义.

您应该做的是仅声明头文件中的变量,然后在单个源文件中定义它们。要将定义更改为声明,最简单的方法是在前面加上 extern 关键字:

#pragma once

extern __constant__ float d_array1[5];
extern __constant__ float d_array2[5];

然后在单个源文件中你有旧的定义:

__constant__ float d_array1[5];
__constant__ float d_array2[5];

#pragma once 或 header include guards 防止一个头文件被多次包含在同一个翻译单元中。

关于c++ - 在 CUDA 头 (.cuh) 文件中使用常量内存时出现 LNK2005 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25721236/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com