C++11 继承和OpenCL的问题
我正在尝试将一些代码从Windows移植到linux。我已经走得很远了,但现在我被一个继承错误所困扰。但我不知道什么不起作用。它似乎没有导入标题,但我不明白为什么,因为在我看来,它应该是有效的 以下是错误输出:C++11 继承和OpenCL的问题,c++11,opencl,C++11,Opencl,我正在尝试将一些代码从Windows移植到linux。我已经走得很远了,但现在我被一个继承错误所困扰。但我不知道什么不起作用。它似乎没有导入标题,但我不明白为什么,因为在我看来,它应该是有效的 以下是错误输出: /usr/bin/c++ -DHAVE_CLOGS -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB -std=c++11 -I/code/cuda/JF-Cut/src/build -I/code/cuda/JF-C
/usr/bin/c++ -DHAVE_CLOGS -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB -std=c++11 -I/code/cuda/JF-Cut/src/build -I/code/cuda/JF-Cut/src/QVisualizer -I/code/cuda/clogs-install/include -I/usr/local/cuda-7.5/targets/x86_64-linux/include -isystem /opt/Qt/5.5/gcc_64/include -isystem /opt/Qt/5.5/gcc_64/include/QtWidgets -isystem /opt/Qt/5.5/gcc_64/include/QtGui -isystem /opt/Qt/5.5/gcc_64/include/QtCore -isystem /opt/Qt/5.5/gcc_64/./mkspecs/linux-g++ -fPIC -o CMakeFiles/QGCWidget.dir/Graph_Cut/QGCWidget.cpp.o -c /code/cuda/JF-Cut/src/QVisualizer/Graph_Cut/QGCWidget.cpp
In file included from /code/cuda/JF-Cut/src/QVisualizer/Graph_Cut/QGCWidget.cpp:44:0:
/code/cuda/JF-Cut/src/QVisualizer/Graph_Cut/../infrastructures/QError.h:45:11: error: ‘cl::Error’ has not been declared
using cl::Error;
^
/code/cuda/JF-Cut/src/QVisualizer/Graph_Cut/../infrastructures/QError.h:48:1: error: expected class-name before ‘{’ token
{
^
/code/cuda/JF-Cut/src/QVisualizer/Graph_Cut/../infrastructures/QError.h: In member function ‘void QError::serialize(std::ostringstream&, cl_int)’:
/home/sansomk/code/cuda/JF-Cut/src/QVisualizer/Graph_Cut/../infrastructures/QError.h:68:13: error: ‘cl::Error’ has not been declared
cl::Error::serialize(s, code);
以下是QError.h的代码
#ifndef QERROR_H
#define QERROR_H
#ifndef __CL_ENABLE_EXCEPTIONS
#define __CL_ENABLE_EXCEPTIONS
#endif
// removed #include "../3rdParty/cl/cl_stacktrace.hpp"
#if defined(__APPLE__) || defined(__MACOSX)
#include <OpenCL/cl.hpp>
#else
#include <CL/cl.hpp>
#endif
#define Q_LOGIC_ERROR -100
#define Q_INVALID_ARGUMENT -101
#define Q_LENGTH_ERROR -102
#define Q_OUT_OF_RANGE -103
#define Q_FUTURE_ERROR -104
#define Q_RUNTIME_ERROR -110
#define Q_RANGE_ERROR -111
#define Q_OVERFLOW_ERROR -112
#define Q_UNDERFLOW_ERROR -113
#define Q_SYSTEM_ERROR -114
using cl::Error;
class QError : public cl::Error
{
protected:
cl_int level_;
void serialize(std::ostringstream& s, cl_int code)
{
std::string error;
switch (code)
{
case Q_LOGIC_ERROR: error = "Q_LOGIC_ERROR"; break;
case Q_INVALID_ARGUMENT: error = "Q_INVALID_ARGUMENT"; break;
case Q_LENGTH_ERROR: error = "Q_LENGTH_ERROR"; break;
case Q_OUT_OF_RANGE: error = "Q_OUT_OF_RANGE"; break;
case Q_FUTURE_ERROR: error = "Q_FUTURE_ERROR"; break;
case Q_RUNTIME_ERROR: error = "Q_RUNTIME_ERROR"; break;
case Q_RANGE_ERROR: error = "Q_RANGE_ERROR"; break;
case Q_OVERFLOW_ERROR: error = "Q_OVERFLOW_ERROR"; break;
case Q_UNDERFLOW_ERROR: error = "Q_UNDERFLOW_ERROR"; break;
case Q_SYSTEM_ERROR: error = "Q_SYSTEM_ERROR"; break;
}
if (!error.empty()) s << " > " << error << ", ";
cl::Error::serialize(s, code);
}
public:
QError(cl_int level, cl_int err, const char * errStr = NULL) : level_(level), cl::Error(err, errStr) {}
~QError() throw() {}
cl_int level(void) const { return level_; }
virtual const char * what() throw ()
{
std::ostringstream s;
serialize(s, err_);
errStr_ = s.str();
return errStr_.c_str();
}
};
#endif // QERROR_H
\ifndef QERROR\H
#定义错误
#ifndef\uu CL\u启用\u异常
#定义\uu CL\u启用\u异常
#恩迪夫
//删除#包括“./3rdParty/cl/cl#u stacktrace.hpp”
#如果已定义(uu苹果公司)| |已定义(u苹果公司)
#包括
#否则
#包括
#恩迪夫
#定义Q_逻辑_错误-100
#定义Q_无效_参数-101
#定义Q_长度_错误-102
#定义Q_OUT_的_范围-103
#定义Q_未来_错误-104
#定义Q_运行时_错误-110
#定义Q_范围_错误-111
#定义Q_溢出_错误-112
#定义Q_下溢_错误-113
#定义Q_系统_错误-114
使用cl::错误;
类错误:public cl::Error
{
受保护的:
国际水平;
无效序列化(std::ostringstream&s,cl_int代码)
{
字符串错误;
开关(代码)
{
案例Q_逻辑错误:ERROR=“Q_逻辑错误”中断;
案例Q_无效参数:error=“Q_无效参数”中断;
案例Q_LENGTH_ERROR:ERROR=“Q_LENGTH_ERROR”中断;
案例Q\U超出范围:错误=“Q\U超出范围”中断;
案例Q_FUTURE_ERROR:ERROR=“Q_FUTURE_ERROR”中断;
案例Q_运行时错误:ERROR=“Q_运行时错误”中断;
案例Q_RANGE_ERROR:ERROR=“Q_RANGE_ERROR”中断;
案例Q_溢出错误:ERROR=“Q_溢出错误”中断;
案例Q_下溢错误:ERROR=“Q_下溢错误”中断;
案例Q_系统错误:ERROR=“Q_系统错误”中断;
}
如果(!error.empty())s要使用cl::error
您需要定义\u cl\u ENABLE\u异常
我可以看到它在那里,但该文件是一个头文件。如果您在编译单元(.cpp)的其他地方包含OpenCL头文件,而没有定义\uuuu CL\u ENABLE\u EXCEPTIONS
。那么后面的包含文件将直接跳过(由于头文件中有ifdefs,以避免同一.h文件的多个实例)
对于这些类型的全局编译定义,您应该做的是在命令行中声明它们
g++ ... -D__CL_ENABLE_EXCEPTIONS
这样可以确保在编译的一开始就启用了定义。同一个头的多个实例有什么问题吗?没有问题,您应该在需要的地方添加头。但是定义头行为方式的全局标志必须在命令行中定义,或者在一次影响所有文件的公共位置。