链接时CUDA多重定义错误
CUDA multiple definition error during linking
我开始在我的一个项目中使用CUDA和thrust,所以我对它的一些方面仍然是新的。我遇到了以下问题。
我必须分开。cu文件,我想使用一个共同的头文件,有一个结构体,他们都应该能够使用。它是这样的:
////////Global.h
#ifndef global_h
#define global_h
struct globalParam
{
uint64_t spaceToUse;
globalParams() : spaceToUse(1024*1024*1024) {}
};
globalParam glParam;
#endif
第一个.cu文件看起来像这样:
////////firstcufile.cu
#ifndef firstcufile_cu
#define firstcufile_cu
#include "Global.h"
template<typename T>
QVector<T> GPUcalculateNormSq(const QVector<T>& real, const QVector<T>& imag)
{
QVector<T> result (real.size());
uint64_t maxSpace = glParam.spaceToUse;
//Some Code to use thrust and using tops maxSpace bytes.
return result;
}
template QVector<float> GPUcalculateNormSq(const QVector<float>& real, const QVector<float>& imag);
template QVector<double> GPUcalculateNormSq(const QVector<double>& real, const QVector<double>& imag);
#endif
第二个.cu文件如下所示:
////////secondcufile.cu
#ifndef secondcufile_cu
#define secondcufile_cu
#include "Global.h"
template<typename T>
double getMean(const T& vec)
{
uint64_t spaceNeededOnGPU = vec.size() * sizeof (T);
uint64_t maxSpace = glParam.spaceToUse;
//Some code to make sure tops maxSpace bytes on GPU
double sum = thrust::reduce(std::begin(vec), std::end(vec));
return sum / vec.size();
}
template double getMean(const QVector<float>& vec);
#endif
现在得到的错误是:
secondcufilecuda_d.o:(.bss+0x18): multiple definition of `glParam'
firstcufilecuda_d.o:(.bss+0x18): first defined here
上面的函数看起来很相似,但那是因为我试图使它们尽可能简单。可以将所有内容写入一个.cu文件中,但如果可能的话,我希望将其拆分。
链接器哪里做错了?我从一个Qt Creator项目内编译和链接。让我知道如果你需要我的行从.pro文件知道我如何使用nvcc编译器。
这是由于Global.h
多次被包含,每次被包含它都提供:globalParam glParam;
。这不是前向声明(即不仅仅是类型签名),而是相当于globalParam
结构体的实际实例化。然后,这会导致两个变量都命名为glParam
(每个对应于Global.h
的单独#include
),并且会给您带来多个定义错误。
快速修复:尝试使用extern
,如果你想共享你的全局变量(然后链接器知道它只是一个引用,好吧,一个'外部'符号)。
更好的修复:考虑重构你的代码,通过引用或指针作为函数的实参传递全局形参。这样,您甚至不必在头文件中声明glParam
变量,绕过整个问题,使您的代码更容易理解/推理。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件