IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

Problème de compilation de wxWidget


Sujet :

wxWidgets

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Problème de compilation de wxWidget
    Bonsoir,

    Dans le cadre du projet ingénieur de mon école, je dois développer une espèce de simulateur. Les "outils" me sont imposés. Pour la modélisation physique je dois utiliser SMASH (VHDL-AMS), pour la 3D OpenGL, les fenêtres et le reste à l'aide de wxWidget.
    L'application doit se présenter sous forme de dll, que le simulateur (SMASH) charge au démarrage (le simulateur propose une API pour réaliser cela).

    Malgré la document assez pauvre de l'api du simulateur, j'ai réussi à réaliser la "connexion". Cependant lorsque j'inclus les headers wx les choses se gattent (ca doit faire 60-80 heures que je suis sur ce problème).

    J'ai essayé de compiler en utilisant wxdevc++, Visual express 2005 et Code::Block.

    Avec le compilateur GNU GCC (mingw c'est ca ?) :

    Alors j'ai compilé wx avec mingw-make avec SHARED=0 et en testant UNICODE 1 et 0.

    l'erreur que j'obtiens : C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/mingw32/bits/c++locale.h:72: error: `snprintf' is not a member of `std'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #if _GLIBCXX_USE_C99
     
    #undef snprintf
    #undef vfscanf
    #undef vscanf
    #undef vsnprintf
    #undef vsscanf
     
    namespace __gnu_cxx
    {
    #if _GLIBCXX_USE_C99_CHECK || _GLIBCXX_USE_C99_DYNAMIC
      extern "C" int
        (snprintf)(char * restrict, size_t, const char * restrict, ...);
      extern "C" int
        (vfscanf)(FILE * restrict, const char * restrict, __gnuc_va_list);
      extern "C" int (vscanf)(const char * restrict, __gnuc_va_list);
      extern "C" int
        (vsnprintf)(char * restrict, size_t, const char * restrict, __gnuc_va_list);
      extern "C" int
        (vsscanf)(const char * restrict, const char * restrict, __gnuc_va_list);
    #endif
    #if !_GLIBCXX_USE_C99_DYNAMIC
      using ::snprintf; /* Erreur à cet endroit !! */
      using ::vfscanf;
      using ::vscanf;
      using ::vsnprintf;
      using ::vsscanf;
    #endif
    }
     
    namespace std
    {
      using __gnu_cxx::snprintf;
      using __gnu_cxx::vfscanf;
      using __gnu_cxx::vscanf;
      using __gnu_cxx::vsnprintf;
      using __gnu_cxx::vsscanf;
    }
    #endif
    J'ai tenté en supprimant les #undef ... mais ca donne :

    `_CoCreateInstance@20'
    ..\..\..\..\..\..\biblio\c++\wxWidgets-2.8.10\lib\gcc_lib/libwxbase28.a(baselib_filename.o):filename.cpp.text+0x1da7): undefined reference to `_IID_IPersistFile'

    Malheureusement je vois pas comment corriger cette erreur ...

    le code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include "windows.h"
    #include "smash_api.h"
     
    #include "wx/wxprec.h"
    #ifndef WX_PRECOMP
    #include "wx/wx.h"
    #endif
     
     
    void Load_Circuit(void *ioUnused)
    {
        SMASH_MessageOK("SMASH", "     Erreur d'ouverture de circuit, veuillez charger le circuit 'Vehicule_brique.pat'    ");
    }
     
     
    DLL_EXPORT void Register()
    {
        SMASH_HookAddCallback("on_post_load", Load_Circuit,NULL);
    }
    Tentative avec Visual c++ 2005

    j'ai bien entendu recompilé wx avec visual : avec beaucoup beaucoup d'efforts, ca compile mais l'application plante au moment d'ouvrir une fenêtre.
    (je sais plus, mais il faut que je touche à d'autres réglages que l'unicode)

    Si j'utilise les lib wx données par le simulateur :

    0MyFrame@@QAE@ABVwxString@@ABVwxPoint@@ABVwxSize@@@Z)
    main.obj : error LNK2001: symbole externe non résolu "int const wxEVT_COMMAND_MENU_SELECTED" (?wxEVT_COMMAND_MENU_SELECTED@@3HB)
    main.obj : error LNK2001: symbole externe non résolu "int const wxEVT_NULL" (?wxEVT_NULL@@3HB)
    bin\Release\test7_cb_vs.dll : fatal error LNK1120: 7 externes non résolus

    le source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include "windows.h"
    #include "smash_api.h"
     
    #include "wx/wxprec.h"
    #ifndef WX_PRECOMP
    #include "wx/wx.h"
    #endif
     
     
    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()
     
    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, _T("&About...") );
        menuFile->AppendSeparator();
        menuFile->Append( ID_Quit, _T("E&xit") );
     
        wxMenuBar *menuBar = new wxMenuBar;
        menuBar->Append( menuFile, _T("&File") );
     
        SetMenuBar( menuBar );
     
        CreateStatusBar();
        SetStatusText( _T("Welcome to wxWindows!") );
    }
     
    void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
    {
        Close(TRUE);
    }
     
    void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
    {
        wxMessageBox(_T("This is a wxWindows Hello world sample"),
            _T("About Hello World"), wxOK | wxICON_INFORMATION, this);
    }
     
     
    void Load_Circuit(void *ioUnused)
    {
        SMASH_MessageOK("SMASH", "     Erreur d'ouverture de circuit, veuillez charger le circuit 'Vehicule_brique.pat'    ");
        MyFrame *frame = new MyFrame( _T("Hello World"), wxPoint(50,50), wxSize(450,340) );
        frame->Show(TRUE);
    }
     
     
    DLL_EXPORT void Register()
    {
        SMASH_HookAddCallback("on_post_load", Load_Circuit,NULL);
    }
    Pour le problème, je pense qu'il y a des différences de versions. Peut être aussi que j'insère les lib dans le mauvais ordre ...
    Bref, je voulais surtout savoir si vous saviez le pourquoi d'une des erreurs, et peut être aussi avoir des conseils pour savoir comment procéder.

    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Il existe un tutoriel sur le site pour compiler wxWidgets avec soit Visual soit MinGW/Code::Block et expliquant comment configurer un projet : Installation de wxWidgets sur Windows
    Typiquement, ton problème de undefined reference to `_IID_IPersistFile' vient qu'une des lib windows n'est pas spécifiée dans les options de liens du projet.
    L'ordre des includes est important pour MinGW il me semble, mais pas pour Visual.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci
    J'ai suivi le tutoriel (pour le compilateur MinGW32) en prenant les mêmes options de compilation.

    => L'application wxwidget minimale fonctionne (celle donnée en exemple, en partant d'un projet "vide").

    Cependant lorsque j'inclus le header que fournit le simulateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "smash_api.h"
    #include "wx/wx.h"
    j'obtiens les erreurs suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    E:\biblio\wxWidgets-2.8.10\include\wx\wxchar.h|1000|error: format string arg not a string type|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\cstdio|167|error: `::snprintf' has not been declared|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\cstdio|170|error: `::vsnprintf' has not been declared|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\cstdio|177|error: `__gnu_cxx::snprintf' has not been declared|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\cstdio|180|error: `__gnu_cxx::vsnprintf' has not been declared|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\mingw32\bits\c++locale.h||In function `int std::__convert_from_v(char*, int, const char*, _Tv, int* const&, int)':|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\mingw32\bits\c++locale.h|72|error: `snprintf' is not a member of `std'|
    E:\biblio\wxWidgets-2.8.10\include\wx\string.h|1203|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\string.h|1208|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\string.h|1240|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\msgout.h|33|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\msgout.h|57|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\msgout.h|69|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\msgout.h|83|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\msgout.h|97|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\msgout.h|109|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|540|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|543|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|544|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|545|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|546|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|547|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|548|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|552|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|558|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|563|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|567|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|571|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|579|error: format string arg not a string type|
    E:\biblio\wxWidgets-2.8.10\include\wx\log.h|584|error: format string arg not a string type|
    ||=== Build finished: 29 errors, 0 warnings ===|
    la première erreur est à ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef wxSnprintf_
        /* no snprintf(), cook our own */
        WXDLLIMPEXP_BASE int
        wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) ATTRIBUTE_PRINTF_3; //ici
    #endif
    Si maintenant j'inverse l'ordre d'inclusion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    E:\Program Files\Dolphin\Smash5121\include\smash_platform.h|141|warning: "F_OK" redefined|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\io.h|196|warning: this is the location of the previous definition|
    E:\Program Files\Dolphin\Smash5121\include\smash_platform.h|142|warning: "X_OK" redefined|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\io.h|199|warning: this is the location of the previous definition|
    E:\Program Files\Dolphin\Smash5121\include\smash_platform.h|143|warning: "R_OK" redefined|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\io.h|201|warning: this is the location of the previous definition|
    E:\Program Files\Dolphin\Smash5121\include\smash_platform.h|144|warning: "W_OK" redefined|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\io.h|200|warning: this is the location of the previous definition|
    E:\Program Files\Dolphin\Smash5121\include\smash_api.h|3292|error: expected initializer before "ATTRIBUTE_PRINTF_6"|
    E:\Program Files\Dolphin\Smash5121\include\smash_api.h|3293|error: expected initializer before "ATTRIBUTE_PRINTF_6"|
    E:\Program Files\Dolphin\Smash5121\include\smash_api.h|3294|error: expected initializer before "ATTRIBUTE_PRINTF_6"|
    ||=== Build finished: 3 errors, 8 warnings ===|
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /*NO_OLE*/SMASH_LINKAGE void   SMASH_VERILOG_MessageMCD                (long, const char *, ...) ATTRIBUTE_PRINTF_2;
    /*NO_OLE*/SMASH_LINKAGE void   SMASH_VHDL_SourceMessage                (const char *, const char *, long, long, long, const char *, ...) ATTRIBUTE_PRINTF_6;//ici
    /*NO_OLE*/SMASH_LINKAGE void   SMASH_VHDL_SourceWarning                (const char *, const char *, long, long, long, const char *, ...) ATTRIBUTE_PRINTF_6;
    Problème de header ... je sais pas trop comment y remédier ...
    (Le simulateur propose des lib pour mingw, donc je pense pas que ce soit un problème de compilateur)

    Le simulateur utilise aussi wxwidget (je pense). Est-il possible que le simulateur utilise une version précédente de wx, et que cela conduise à ces problèmes ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    L'article s'appuie sur la version 4.3.3 de GCC/MinGW. Une différence de version peut amener un problème.

    Sinon, j'ai du (je ne sais plus pour quelles raisons) modifier à la main un fichier de GCC/MinGW pour les programmes UNICODE car ils ont bugs connus. Dans MinGW\lib\gcc\mingw32\4.3.3\include\c++, il faut ouvrir le fichier 'cwchar' et aux lignes ~164 et ~171, il faut encadrer les using ::swprintf; et using ::vswprintf; d'un #ifndef __STRICT_ANSI__/#endif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifndef __STRICT_ANSI__ // Ajout 3DArchi
      using ::swprintf;
    #endif
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifndef __STRICT_ANSI__ // Ajout 3DArchi
      using ::vswprintf;
    #endif

Discussions similaires

  1. Problème de compilation projet wxwidget sous Code::block
    Par Benoit_T dans le forum wxWidgets
    Réponses: 1
    Dernier message: 17/02/2011, 14h56
  2. Problème de compilation wxwidgets sous Linux
    Par Zoloom dans le forum wxWidgets
    Réponses: 0
    Dernier message: 12/05/2008, 01h50
  3. wxwidgets, VC++ 6: problème de compilation
    Par Biosox dans le forum wxWidgets
    Réponses: 4
    Dernier message: 26/10/2006, 13h58
  4. Problème de compilation de la DLL du XMLRad
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/04/2003, 16h46
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo