2016-03-01 78 views
2

我想從Windows移植一些代碼到linux。我已經變得相當遠了,但是現在我因繼承而陷入了一個錯誤。但我無法弄清楚什麼不起作用。它似乎沒有導入標題,但我無法弄清楚爲什麼,因爲在我看來應該是有效的。繼承和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

我可以看到你有它,但該文件是一個頭文件。如果您在編譯單元(.cpp)中的其他位置包含OpenCL標頭,但未定義__CL_ENABLE_EXCEPTIONS。然後後面的包括將簡單地跳過(由於頭文件中的ifdefs,以避免相同的.h文件的多個實例)。

你應該爲這些類型的全局編譯定義做什麼,是在命令行中聲明它們。

g++ ... -D__CL_ENABLE_EXCEPTIONS 

通過這種方式,您可以確保在編譯的最開始處啓用定義。

+0

有相同頭的多個實例有什麼不對嗎? –

+0

不是的,你應該在你需要的地方添加標題。但是定義頭文件行爲的全局標誌必須在命令行中定義,或者在影響所有文件的普通位置中定義。 – DarkZeros