我从OpenCL 2.0 C ++绑定头文件cl2.hpp收到链接器错误。我的所有标题文件都直接来自Khronos OpenCL registry和I 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头文件中它是一个糟糕的设计吗?
答案 0 :(得分:1)
问题在于违规功能是非内联成员功能。这意味着当多个源文件中包含cl2.hpp
时,将会有多个函数定义副本在这些目标文件链接在一起时发生冲突。
简单的解决方案是将违规函数标记为inline
(标题中已有许多其他函数)。