Récupérer une application générée par wxGlades

dip2technique
Récupérer une application générée par wxGlades

Bonjour à tous,
Désirant essayer le développement de petits programmes ( c++) avec fenêtres graphiques je viens d'installer sur mon système windows 2000 : Eclipse SDK 3.2
Le plugin CDT 3.1 ( pour le c++)
MinGW 5.0 + MSYS 1.0.11 ( pour la compilation
wxWidgets 2.8.4 comme bibliothèque

J'ai trouvé un tuto qui expliquait comment installer le tout et grâce à ce même tuto j'ai ( en faisant copier/ coller) pu compiler un petit prog qui ouvre une fenêtre simple lors du lancement de l'exécution.
A la lecture du .cpp j'ai trouvé que l'utilisation de wxWidgets était un peu confuse pour moi et après des recherches sur le NET j'ai lu un tuto qui proposait de commencer le développement avec wxWidgets en utilisant un RAD " wxGlades". j'ai donc intallé wxGlades 0.5 et pour comparer avec le premier programme .cpp ci-dessus j'ai, à l'aide de wxGlade créé une fenêtre identique. Puis j'ai récupéré les fichiers générés pour les intégrer dans un nouveau projet créé avec l'IDE ECLIPSE.

-----------------Le fichier .h

// -*- C++ -*- generated by wxGlade 0.5 on Fri Aug 17 20:33:12 2007
#include "wx/wx.h"
#include "wx/image.h"
// begin wxGlade: ::dependencies
// end wxGlade

#ifndef ESSAI2_H
#define ESSAI2_H

class MyFrame: public wxFrame {
public:
// begin wxGlade: MyFrame::ids
// end wxGlade
MyFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE);
private:
// begin wxGlade: MyFrame::methods
void set_properties();
void do_layout();
// end wxGlade
protected:
// begin wxGlade: MyFrame::attributes
wxMenuBar* frame_1_menubar;
wxStatusBar* frame_1_statusbar;
// end wxGlade
}; // wxGlade: end class

#endif // ESSAI2_H

-----------le fichier.cpp

// -*- C++ -*- generated by wxGlade 0.5 on Fri Aug 17 20:33:12 2007
#include "Essai2.h"

MyFrame::MyFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
wxFrame(parent, id, title, pos, size, wxDEFAULT_FRAME_STYLE)
{
// begin wxGlade: MyFrame::MyFrame
frame_1_menubar = new wxMenuBar();
SetMenuBar(frame_1_menubar);
wxMenu* Fichier = new wxMenu();
frame_1_menubar->Append(Fichier, wxT("Fichier"));
wxMenu* Aide = new wxMenu();
frame_1_menubar->Append(Aide, wxT("Aide"));
frame_1_statusbar = CreateStatusBar(1, 0);
set_properties();
do_layout();
// end wxGlade
}

void MyFrame::set_properties()
{
// begin wxGlade: MyFrame::set_properties
SetTitle(wxT("Essai fenêtre"));
int frame_1_statusbar_widths[] = { -1 };
frame_1_statusbar->SetStatusWidths(1, frame_1_statusbar_widths);
const wxString frame_1_statusbar_fields[] = {
wxT("Essai réussi")
};
for(int i = 0; i < frame_1_statusbar->GetFieldsCount(); ++i) {
frame_1_statusbar->SetStatusText(frame_1_statusbar_fields[i], i);
}
// end wxGlade
}

void MyFrame::do_layout()
{
// begin wxGlade: MyFrame::do_layout
wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL);
SetSizer(sizer_1);
sizer_1->Fit(this);
Layout();
// end wxGlade
}

J'ai ensuite créé le fichier makfile : ( :( en recopiant bêtement je dois avouer le fichier que j'ai utilisé dans la création du premier programme mais en changeant le nom de l'exécutable à créer)

-------------------makefile

# Détermine le nom du fichier exécutable.
EXEC = Essai2.exe
# Détermine la liste des fichiers sources.
SRCS = $(wildcard *.cpp)
# Détermine le nom du fichier qui contiendra
# les dépendances.
DEPFILE = .depend
# Construit la liste des fichiers temporaires à partir
# de la liste des fichiers sources.
OBJS = $(SRCS:%.cpp=%.o)
# wxWidgets variables
SCRDIR = j:/Programmation/eclipse/wxWidgets-2.8.4/
BUILDDIR = j:/Programmation/eclipse/wxWidgets-2.8.4/build-debug/
INCLUDEDIR = j:/Programmation/eclipse/wxWidgets-2.8.4/include/
CPPFLAGS = -DNO_GCC_PRAGMA -D__WXDEBUG__ \
-I${BUILDDIR}lib/wx/include/msw-ansi-debug-static-2.8 \
-I${SCRDIR}/include
CXXFLAGS = -ggdb -O0 -mthreads -Wall -Wno-ctor-dtor-privacy
LIBDIRNAME = $(BUILDDIR)lib
LDFLAGS_GUI = -mwindows
SAMPLES_RPATH_FLAG =
WXDEBUGFLAG = d
WX_LIB_FLAVOUR =
WX_RELEASE = 2.8
HOST_SUFFIX =
TOOLKIT_LOWERCASE = msw
TOOLKIT_VERSION =
PORTNAME = $(TOOLKIT_LOWERCASE)$(TOOLKIT_VERSION)
COND_MONOLITHIC_0___WXLIB_CORE_p_PART1 = \
-lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)
COND_MONOLITHIC_0___WXLIB_CORE_p_PART2 = \
$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX)
COND_MONOLITHIC_0___WXLIB_CORE_p = \
$(COND_MONOLITHIC_0___WXLIB_CORE_p_PART1)$(COND_MONOLITHIC_0___WXLIB_CORE_p_PART2)
__WXLIB_CORE_p = $(COND_MONOLITHIC_0___WXLIB_CORE_p)
COND_MONOLITHIC_0___WXLIB_BASE_p_PART1 = \
-lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)
COND_MONOLITHIC_0___WXLIB_BASE_p_PART2 = \
$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
COND_MONOLITHIC_0___WXLIB_BASE_p = \
$(COND_MONOLITHIC_0___WXLIB_BASE_p_PART1)$(COND_MONOLITHIC_0___WXLIB_BASE_p_PART2)
__WXLIB_BASE_p = $(COND_MONOLITHIC_0___WXLIB_BASE_p)
__LIB_TIFF_p = -lwxtiff$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_JPEG_p = -lwxjpeg$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_PNG_p = -lwxpng$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_ZLIB_p = -lwxzlib$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p = \
-lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
__LIB_REGEX_p = $(COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p)
__LIB_EXPAT_p = -lwxexpat$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
EXTRALIBS = -mthreads -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32
EXTRALIBS_FOR_BASE = $(EXTRALIBS)
EXTRALIBS_GUI =
EXTRALIBS_FOR_GUI = $(EXTRALIBS_GUI)
# Cette règle correspond à la règles par défaut.
all: $(DEPFILE) $(EXEC)
# Cette règle supprime tous les fichiers temporaires.
clean:
$(RM) *~ *.o \#*
# Cette règle supprime tous les fichiers temporaires,
# l'exécutable et le fichier de dépendance.
cleanall: clean
$(RM) $(EXEC) $(DEPEND_FILE)
# Cette règle créé, à proprement parlé, l'exécutable
# $(EXEC).
$(EXEC): $(OBJS)
g++ $(OBJS) -o $(EXEC) -L $(LIBDIRNAME) \
$(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG) \
$(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) \
$(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) \
$(__LIB_ZLIB_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) \
$(EXTRALIBS_FOR_BASE) $(EXTRALIBS_FOR_GUI)
# Cette règle créé un fichier de dépendances, $(DEPFILE),
# pour les fichiers contenus dans $(SRCS).
$(DEPFILE): $(SRCS)
g++ -MM -I $(INCLUDEDIR) $(CPPFLAGS) $(CXXFLAGS) $(SRCS) > $(DEPFILE)
# Insère les dépendances générées par la règle $(DEPFILE).
-include $(DEPFILE)

et j'ai lancé la compilation mais je me retrouve avec l'erreur suivante:

mingw32-make -f makefile all
g++ Essai2.o -o Essai2.exe -L j:/Programmation/eclipse/wxWidgets-2.8.4/build-debug/lib \
-mwindows \
-lwx_mswd_core-2.8 -lwx_based-2.8 \
-lwxtiffd-2.8 -lwxjpegd-2.8 -lwxpngd-2.8 \
-lwxzlibd-2.8 -lwxregexd-2.8 -lwxexpatd-2.8 \
-mthreads -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32
J:/Programmation/eclipse/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../libmingw32.a(main.o):main.c:(.text+0x106): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
mingw32-make: *** [Essai2.exe] Error 1

Si vous pouviez m'aider cela serai super ! mais risque hélas de provoquer d'autres questions de ma part car je ne fai que de débuter et il faudra certainnement m'expliquer en détail le contenu de ce fameux fichier makefile au quel je ne comprends pas grand chose :oops:
D' avance merci de votre gentillesse. JP

fredericmazue

Quote:
A la lecture du .cpp j'ai trouvé que l'utilisation de wxWidgets était un peu confuse pour moi

Il n'y a pas que pour toi. :)

Quote:
" wxGlades".

Comme ça c'est pire....

hum wxWidget, wxGlade et Eclipse/CDT. Tu es un gars qui cumule volontiers les difficultés....

Pour ton problème c'est tout simple.
WinMain est le point d'entrée de toute application Windows fenêtrée, donc au final d'une application wxWidget/Windows aussi. C'est l'éditeur de liens qui cherche la fonction WinMain et comme il ne la trouve pas, il râle.
En wxWidget ce point d'entrée est encapsulé dans la classe wxApp.
Ton projet généré par wxGlades ou pas, makefilo-bidouillé ou pas (je te cite: "J'ai ensuite créé le fichier makfile : ( en recopiant bêtement je dois avouer le fichier que j'ai utilisé dans la création du premier programme mais en changeant le nom de l'exécutable à créer)" ) DOIT obligatoirement comporter une classe wxApp, ce qui n'est pas le cas ici sauf erreur de ma part, d'où ton problème.

Bon, encore autre chose, même si ce n'est pas la question. Si tu veux du code C++ plus lisible et plus propre, regarde un peu Qt, Juce, Smartwin++, Gtkmm, par exemple.
WxWidgets, je l'aimais bien et je m'en suit servi dans le temps, mais maintenant wxWidgets évoluant, il y a tellement de macros malheureuses et contestables tout partout, que le code est par trop vilain. Et puis sous Linux (pas tron problème aujourd'hui,n mais qui sait un jour....), l'encapsulation de Gtk avec ses ASSERT failure tout partout laisse franchement à désirer.