2017-09-14 8 views
2

ich auf Anbieter-Header swig zu laufen bin versucht swig so brauche ich nicht, die Umsetzung in einer separaten Header-Datei unterwie auslassen Vorwärtsdeklaration

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 

Ich erhalte den Fehler neu zu definieren, während go build

$HOME/Qt5.9.1/5.9.1/gcc_64/include/QtWidgets/qapplication.h:57: Error: Syntax error in input(1).

Nach Inspektion

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; 

Offensichtlich scheitern auf der Forward-Deklaration.

Unten ist 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> 

Wie kann ich damit swig ändern lässt die Vorwärts-Erklärung?

Antwort

2

Wenn Sie wirklich SWIG müssen informieren es etwas im Quellcode ignorieren sollten, können Sie die Makros verwenden, es definiert: Documentation

So Ihre qapplication.h wechselt:

#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 

Be Vorsicht mit dieser Taktik im Allgemeinen, obwohl Sie am Ende etwas tun können, um den SWIG-Präprozessor zum Erfolg zu bringen, aber dann die C++ - Kompilierung nicht bestehen, weil Sie etwas Wichtiges weggelassen haben.

Ein anderer Ansatz ist es, %include insgesamt zu vermeiden (aus Unternehmenserfahrung hier). Wenn Ihr Projekt wächst, wird SWIG immer langsamer, wenn Sie alles aus Ihren Header-Dateien einbinden. Am Ende lohnt es sich, nur die Deklarationen zu kopieren, die SWIG benötigt.

+0

danke. Ich bevorzuge die zweite Option und jetzt mit Typmap stecken – user642318

+0

Der Grund, warum Sie den Fehler erhalten, ist entweder aufgrund SWIG kann nicht Headerdateien recurse. Wenn Sie mit Schnittstellen extrem streng sind (Header-only Zeug zu vermeiden) und Header in der Reihenfolge, die sie benötigt werden, enthalten, SWIG kann verwendet werden, um ziemlich große Projekte zu wickeln. Ich arbeite an einem Projekt mit fast 40.000 generierten Codezeilen. Die SWIG-Teile bauen viel schneller als das QT-Zeug –

Verwandte Themen