使用的OpenCL 2.0 C ++绑定头文件链接错误(Linker error using Ope

2019-11-04 02:39发布

我是从2.0的OpenCLÇ得到一个链接器错误++绑定头文件cl2.hpp 。 我所有的头文件直接来自Khronos的OpenCL的注册表和我建立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头文件一个糟糕的设计?

Answer 1:

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

简单的解决方案是标记有问题的功能inline (如许多的标头中的其它功能已经是)。



文章来源: Linker error using OpenCL 2.0 C++ bindings header file