使用OpenCL 2.0 C ++绑定头文件的链接器错误

时间:2015-10-19 12:48:49

标签: c++ visual-studio qt opencl

我从OpenCL 2.0 C ++绑定头文件cl2.hpp收到链接器错误。我的所有标题文件都直接来自Khronos OpenCL registryI build the OpenCL.lib文件。使用OpenCL 1.2 C ++绑定头文件时,我没有收到错误。

我正在使用Qt 5.5.0和Visual Studio C ++ 2013和Windows7 64位。

错误与多个源文件中的多个定义符号有关。

mainwindow.cpp.obj:-1: error: LNK2005: "enum cl::QueueProperties __cdecl
 cl::operator|(enum cl::QueueProperties,enum cl::QueueProperties)"
 (??Ucl@@YA?AW4QueueProperties@0@W410@0@Z) already defined in main.cpp.obj

我不明白为什么编译器说这已经定义了。

我已将问题缩小到cl2.hpp文件中的代码

QueueProperties operator|(QueueProperties lhs, QueueProperties rhs)
{
    return static_cast<QueueProperties>(static_cast<cl_command_queue_properties>(lhs) | static_cast<cl_command_queue_properties>(rhs));
}

当我评论代码时,我的项目编译并运行正常。你对这个问题有什么线索吗?在cl2.hpp头文件中它是一个糟糕的设计吗?

1 个答案:

答案 0 :(得分:1)

问题在于违规功能是非内联成员功能。这意味着当多个源文件中包含cl2.hpp时,将会有多个函数定义副本在这些目标文件链接在一起时发生冲突。

简单的解决方案是将违规函数标记为inline(标题中已有许多其他函数)。