我从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头文件中的设计不好吗?
最佳答案
问题是有问题的函数是非内联成员函数。这意味着当多个源文件中包含cl2.hpp
时,将有多个函数定义副本,当这些目标文件链接在一起时,它们会发生冲突。
一种简单的解决方案是将有问题的功能标记为inline
(与标头中的许多其他功能一样)。