2017-09-14 174 views
2

我试图运行痛饮对供应商的头,所以我并不需要重新实施在一个单独的头文件如何痛饮省略向前声明

swig -go -cgo -intgosize 64 -module qt -o $WORK/qt/_obj/qt_wrap.cxx -outdir $WORK/qt/_obj/ \ 
-I$HOME/Qt5.9.1/5.9.1/gcc_64/include -I$HOME/Qt5.9.1/5.9.1/gcc_64/include/QtOpenGL \ 
-I$HOME/Qt5.9.1/5.9.1/gcc_64/include/QtWidgets -I$HOME/Qt5.9.1/5.9.1/gcc_64 \ 
/include/QtGui -I$HOME/Qt5.9.1/5.9.1/gcc_64/include/QtCore -c++ qt.swigcxx 

我收到以下错误时go build

​​

在检查

qapplication.h:57

#include <QtWidgets/qtwidgetsglobal.h> 
#include <QtCore/qcoreapplication.h> 
#include <QtGui/qwindowdefs.h> 
#include <QtCore/qpoint.h> 
#include <QtCore/qsize.h> 
#include <QtGui/qcursor.h> 
#ifdef QT_INCLUDE_COMPAT 
# include <QtWidgets/qdesktopwidget.h> 
#endif 
#include <QtGui/qguiapplication.h> 

QT_BEGIN_NAMESPACE 


class QDesktopWidget; 

前向声明显然失败。

下面是qt.swigcxx:

// See swig.org for more inteface options, 
// e.g. map std::string to Go string 
%module qt 
%{ 
#include <QPushButton> 
#include <QApplication> 
%} 

%ignore ""; 


%include <qapplication.h> 
%include <qpushbutton.h> 

我怎样才能改变使痛饮省略了向前声明?

回答

2

如果你真的需要通知痛饮应该忽略在源代码中的东西,你可以用它定义了宏:Documentation

所以你qapplication.h更改为:

#include <QtWidgets/qtwidgetsglobal.h> 
#include <QtCore/qcoreapplication.h> 
#include <QtGui/qwindowdefs.h> 
#include <QtCore/qpoint.h> 
#include <QtCore/qsize.h> 
#include <QtGui/qcursor.h> 
#ifdef QT_INCLUDE_COMPAT 
# include <QtWidgets/qdesktopwidget.h> 
#endif 
#include <QtGui/qguiapplication.h> 

QT_BEGIN_NAMESPACE 

#ifndef SWIG 
class QDesktopWidget; 
#endif 

要尽管小心这种策略,但是,最终可能会让SWIG预处理器成功,但是由于您遗漏了一些重要的东西而导致C++编译失败。

另一种方法是完全避免%include(从这里的企业经验来讲)。随着项目规模的扩大,由于包含头文件中的所有内容,SWIG会越来越慢。最后,复制SWIG需要的声明对于编译时间是值得的。

+0

谢谢。我更喜欢第二个选项,现在卡住了typemap – user642318

+0

你得到这个错误的原因是由于SWIG无法递归头文件。如果你对接口非常严格(避免仅包含头文件),并且按照需要的顺序包含头文件,SWIG可用于包装相当大的项目。我使用近40,000行生成的代码工作在一个项目上。 SWIG零件的构建方式比QT的东西快 –