[C++/wxWidget] Problème de compilation

Bonjour,

A la recherche d’un solution pour faire une interface graphique pour un programme écrit en C++, j’ai trouvé la librairie wxWidget qui a l’avantage de se porter assez facilement sous Windows apparemment.

Je suis sur une Debian 3.1 sous linux. J’ai donc téléchargé les packages nécessaires à la librairie wxWidget.

J’ai trouvé un petit tutorial sur le site www.wxwidgets.org permettant de faire un petit “Hello World” avec la librairie histoire de voir si j’avais tout bien installé.

Le tutorial est à cette adresse :

www.wxwidgets.org/hello.htm

J’ai donc crée un fichier hworld.cpp comme expliqué dans le tutorial.
Je compile avec la ligne suivante comme expliqué dans le tutorial toujours :


g++ hworld.cpp `wx-config --libs` `wx-config --cxxflags` -o hworld

J’obtiens ces erreurs :


$ g++ hworld.cpp `wx-config --libs` `wx-config --cxxflags` -o hworld
hworld.cpp:9: error: base class `wxFrame' has incomplete type
hworld.cpp:11: error: erreur d'analyse syntaxique before `&' token
hworld.cpp:13: error: `wxCommandEvent' was not declared in this scope
hworld.cpp:13: error: `event' was not declared in this scope
hworld.cpp:13: error: invalid data member initialization
hworld.cpp:13: error: (use `=' to initialize static data members)
hworld.cpp:13: error: variable or field `OnQuit' declared void
hworld.cpp:14: error: `wxCommandEvent' was not declared in this scope
hworld.cpp:14: error: `event' was not declared in this scope
hworld.cpp:14: error: invalid data member initialization
hworld.cpp:14: error: variable or field `OnAbout' declared void
hworld.cpp:26: error: incomplete type `wxFrame' does not have member `
   sm_eventTable'
hworld.cpp:27: error: `wxCommandEventFunction' was not declared in this scope
hworld.cpp:28: error: `wxCommandEventFunction' was not declared in this scope
hworld.cpp: Dans function « wxApp* wxCreateApp() »:
hworld.cpp:31: error: cannot allocate an object of type `MyApp'
hworld.cpp:31: error:   because the following virtual functions are abstract:
/usr/include/wx/app.h:131: error:       virtual int wxAppBase::OnRun()
hworld.cpp: Dans member function « virtual bool MyApp::OnInit() »:
hworld.cpp:36: error: invalid use of undefined type `struct wxPoint'
/usr/include/wx/utils.h:46: error: forward declaration of `struct wxPoint'
hworld.cpp:36: error: `wxSize' undeclared (first use this function)
hworld.cpp:36: error: (Each undeclared identifier is reported only once for
   each function it appears in.)
hworld.cpp:37: error: `Show' undeclared (first use this function)
hworld.cpp:38: error: `SetTopWindows' undeclared (first use this function)
hworld.cpp: At global scope:
hworld.cpp:42: error: erreur d'analyse syntaxique before `&' token
hworld.cpp:45: error: erreur de syntaxe before `->' token
hworld.cpp:46: error: erreur de syntaxe before `->' token
hworld.cpp:47: error: erreur de syntaxe before `->' token
hworld.cpp:48: error: erreur de syntaxe before `*' token
hworld.cpp:49: error: erreur de syntaxe before `->' token
hworld.cpp:50: error: `menuBar' was not declared in this scope
hworld.cpp:50: error: le C++ ISO interdit la déclaration de « SetMenuBar » sans
   type
hworld.cpp:50: error: `int MyFrame::SetMenuBar' is not a static member of `
   class MyFrame'
hworld.cpp:51: error: le C++ ISO interdit la déclaration de « CreateStatusBar »
   sans type
hworld.cpp:52: error: le C++ ISO interdit la déclaration de « SetStatusText »
   sans type
hworld.cpp:52: error: `int MyFrame::SetStatusText' is not a static member of `
   class MyFrame'
hworld.cpp:52: error: conversion invalide de « const char* » vers « int »
hworld.cpp:53: error: erreur d'analyse syntaxique before `}' token
hworld.cpp:55: error: `wxCommandEvent' was not declared in this scope
hworld.cpp:55: error: erreur d'analyse syntaxique before `)' token
hworld.cpp:56: error: no `void MyFrame::OnQuit(...)' member function declared
   in class `MyFrame'
hworld.cpp:56: error: declaration of `void MyFrame::OnQuit(...)'
hworld.cpp:13: error: conflicts with previous declaration `int MyFrame::OnQuit'
hworld.cpp: Dans member function « void MyFrame::OnQuit(...) »:
hworld.cpp:57: error: `Close' undeclared (first use this function)
hworld.cpp: At global scope:
hworld.cpp:60: error: `wxCommandEvent' was not declared in this scope
hworld.cpp:60: error: erreur d'analyse syntaxique before `)' token
hworld.cpp:61: error: no `void MyFrame::OnAbout(...)' member function declared
   in class `MyFrame'
hworld.cpp:61: error: declaration of `void MyFrame::OnAbout(...)'
hworld.cpp:14: error: conflicts with previous declaration `int MyFrame::OnAbout
   '
hworld.cpp: Dans member function « void MyFrame::OnAbout(...) »:
hworld.cpp:62: error: `wxMessageBox' undeclared (first use this function)


et voici le contenu de hworld.cpp :


#include "wx/wx.h"

class MyApp: public wxApp
{
	virtual bool OnInit();
};

class MyFrame: public wxFrame
{
	public:
  MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
  
  void OnQuit(wxCommandEvent& event);
  void OnAbout(wxCommandEvent& event);
  
  DECLARE_EVENT_TABLE();
  
}; 

enum
{
ID_Quit=1,
ID_About
};

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(MyApp)


bool MyApp::OnInit()
{
	MyFrame *frame = new MyFrame("Hello World",wxPoint(50,50),wxSize(450,340));
	frame->Show(TRUE);
	SetTopWindows(frame);
	return TRUE;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size): wxFrame((wxFrame *)NULL,-1,title,pos,size)
{
	wxMenu *menuFile = new wxMenu;
	menuFile->Append(ID_About,"&About...");
	menuFile->AppendSeparator();
	menuFile->Append(ID_Quit,"E&xit");
	wxMenuBar *menuBar = new wxMenuBar;
	menuBar->Append(menuFile,"&File");
	SetMenuBar(menuBar);
	CreateStatusBar();
	SetStatusText("Welcome to wxWidgets!");
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
	Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
	wxMessageBox("This is a wxWidgets Hello world sample","About Hello world", wxOK | wxICON_INFORMATION, this);
}


J’ai du mal installer quelque chose mais je vois pas quoi.
Quelqu’un aurait une idée d’où ça peut venir exactement ?

Je vois qu’il n’y a pas eu de réponse sur HFR :wink:
Commence par vérifier que wx-config --libs pointe au bon endroit.
Tu peux aussi ajouter toi même l’endroit des includes :

g++ hworld.cpp -I/usr/lib/wx/include/gtk2-2.4 wx-config --cxxflags -o hworld

Vérifie la même chose pour wx-config --cxxflags, si ça sort rien du tout :

g++ hworld.cpp -E -O2 -Wall -g -fexceptions -I/usr/lib/wx/include/gtk2-2.4 -DGTK_NO_CHECK_CASTS -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES

Et pour l’include fait plutôt :

#include <wx/wx.h>

Y a pas grand monde qui a l’air de connaitre wxWidget on dirait bien en fait, y aurait peut être mieux fallu que je teste sur le forum en anglais si y en a un.

J’avais déjà regardé et j’ai ça :

J’ai tenté en mettant en incluant <wx/wx.h>, c’est pareil et en mettant moi même les chemins des librairies c’est pareil en fait dans le premier cas et quand je compile avec :

g++ hworld.cpp -E -O2 -Wall -g -fexceptions -I/usr/lib/wx/include/gtk2-2.4 -DGTK_NO_CHECK_CASTS -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES

ça m’affiche du code dans la console (dont le code de hworld.cpp).

C’est pas une question de connaitre ou pas wxWidget mais un problème d’installation du toolkit, je n’ai jamais eu le moindre soucis sous windows.
Si ca ne compile pas, c’est que l’installation foire forcément quelque part.

Ouais je me doute, mais j’arrive pas à trouver où.

Quand c’est comme ça, plutôt qu’essayer de résoudre les problèmes de compilation, essaye :

  • de tout supprimer et de réinstaller,
  • de prendre le toolkit sur un autre site,
  • de prendre une autre version,
  • de compiler le toolkit sur ta machine,
  • ou carrément de prendre une IDE avec wxWidget d’intégré (c’est le cas pour mon devc++ sous win32).

Tu peux essayer un exemple d’ici :

http://chgi.developpez.com/wxwidgets/

Sinon install peut-être kdevelop, je l’utilise pour créer des applis wxwidgets et ca fonctionne bien :slight_smile:

J’ai déjà vu ces tutoriaux et je les ai testés.
Mais le problème est le même. De toute façon si pour un simple Hello World ça marche pas
c’est que l’installation n’a pas du se faire correctement.
Je vais virer les paquets que j’ai installés sur ma debian et faire une installation directement avec les sources.