2016-03-01 3 views
2

Я пытаюсь перенести некоторый код в linux из Windows. Я получил довольно далеко, но теперь я застрял в ошибке с наследованием. Но я не могу понять, что не работает. Похоже, что он не импортирует заголовок, но я не могу понять, почему, поскольку мне кажется, что он должен работать.Проблемы с Inheritance и OpenCL

вот выход ошибки:

/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 

ответ

2

Для того, чтобы использовать cl::Error вам нужно определить __CL_ENABLE_EXCEPTIONS.

Я вижу, что у вас есть это, но этот файл является файлом заголовка. Если вы включаете заголовки OpenCL в другое место ранее в блок компиляции (.cpp) без определения __CL_ENABLE_EXCEPTIONS. Затем более поздняя версия просто пропустит (из-за ifdefs в файле заголовка, чтобы избежать нескольких экземпляров одного и того же файла .h).

Что вы должны сделать для этих типов глобальной компиляции, определяет, объявляет их в командной строке.

g++ ... -D__CL_ENABLE_EXCEPTIONS 

Таким образом, вы обеспечиваете, чтобы определения были включены в самом начале компиляции.

+0

Есть ли что-то неправильное, если есть несколько экземпляров одного и того же заголовка? –

+0

Это не так, вы должны добавить заголовок везде, где он вам нужен. Но глобальные флаги, определяющие, как должны вести себя заголовки, должны быть либо определены в командной строке, либо в общем месте, которое влияет на все файлы. – DarkZeros