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