【问题标题】:Linker error using OpenCL 2.0 C++ bindings header file使用 OpenCL 2.0 C++ 绑定头文件的链接器错误
【发布时间】:2015-10-19 12:48:48
【问题描述】:

我收到来自 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,是否可以解决问题?
  • 我同意@jprice,这看起来像是缺少inline 的情况,因为如果标头包含在两个不同的编译单元中,您将对该函数进行多重定义。 .
  • @jprice,是的,inline 修复了它。随意写一个答案。有比内联更好的解决方案吗?我通常使用静态内联。那么匿名命名空间呢?我的 C++ 技能很弱。我想有人应该向 Khronos 报告错误?
  • 我认为inlinestatic inline 很好,这就是处理标头中的其他许多功能,这个只是从裂缝中溜走。我可以在 Khronos 中解决这个问题,所以它会在下一个版本中推出。

标签: c++ visual-studio qt opencl


【解决方案1】:

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

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

【讨论】:

  • 我只明确包含了 cl2.hpp 文件一次。但是,我认为对于 Qt 的 moc 预处理器,它再次被隐式包含。我在 Qt 生成的文件中看到了副本,扩展名为 _automoc.cpp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2020-07-10
  • 2021-07-12
相关资源
最近更新 更多