Я пытаюсь запустить Swig на заголовке поставщика, поэтому мне не нужно переопределять реализацию в отдельном заголовочном файле.
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
$ HOME / Qt5.9.1 / 5.9.1 / gcc_64 / include / QtWidgets / qapplication.h: 57: Ошибка:
Синтаксическая ошибка в вводе (1).
После проверки
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_NAMESPACEclass 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>
Как я могу изменить так, чтобы swig пропустил предварительное объявление?
Если вам действительно нужно сообщить SWIG, что он должен что-то игнорировать в исходном коде, вы можете использовать макросы, которые он определяет: Документация
Таким образом, ваш 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, того стоит для времени компиляции.
Других решений пока нет …