我从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头文件中的设计不好吗?

最佳答案

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

一种简单的解决方案是将有问题的功能标记为inline(与标头中的许多其他功能一样)。

10-08 08:23