wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :668

Membres en ligne : 0
Invités en ligne : 8
Pub hébergeur
Pourquoi cette pub ?

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Compilation - Installation - Réglages IDE
» Erreur lors de l'édition des liens avec les lib wxPropertyGrid
Conversation : Erreur lors de l'édition des liens avec les lib wxPropertyGrid
23-03-2011 19:54:27  Erreur lors de l'édition des liens avec les lib wxPropertyGrid #1
ld13 (Nouveau membre)
Inscrit le : 11-12-2010
Messages: 6
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour,
Cela fait 2 jours que je bute sur un problème!

Je vous fait le tableau:
J'essaie en vain d'utiliser la librairie wxPropertyGrid sous Windows 7 (sous Ubuntu, cette librairie fonctionne).

Je suis parti de la configuration suivante:
- Compilateur: MinGW 4.5.1;
- IDE: CodeBlocks
- Librairies wxWidgets 2.8.11 (compilée avec MinGW 4.5.1): pas de problème;
- Librairie wxPropertyGrid 1.4.15 (compilée avec aussi MinGW 4.5.1): pas de problème;

J'ai écrit un programme simpliste:

Code Cpp:

Test_wxFrame::Test_wxFrame(wxFrame *frame, const wxString& title)
    : wxFrame(frame, -1, title)
{
#if wxUSE_MENUS
    // create a menu bar
    wxMenuBar* mbar = new wxMenuBar();
    wxMenu* fileMenu = new wxMenu(_T(""));
    fileMenu->Append(idMenuQuit, _("&Quit\tAlt-F4"), _("Quit the application"));
    mbar->Append(fileMenu, _("&File"));
 
    wxMenu* helpMenu = new wxMenu(_T(""));
    helpMenu->Append(idMenuAbout, _("&About\tF1"), _("Show info about this application"));
    mbar->Append(helpMenu, _("&Help"));
 
    SetMenuBar(mbar);
#endif // wxUSE_MENUS
 
#if wxUSE_STATUSBAR
    // create a status bar with some information about the used wxWidgets version
    CreateStatusBar(2);
    SetStatusText(_("Hello Code::Blocks user!"),0);
    SetStatusText(wxbuildinfo(short_f), 1);
#endif // wxUSE_STATUSBAR
    wxPropertyGrid* pg = new wxPropertyGrid(
        this,
        wxID_ANY,
        wxDefaultPosition,
        wxDefaultSize,
        wxPG_SPLITTER_AUTO_CENTER|wxPG_DEFAULT_STYLE);
}


La compilation se passe bien, par contre lors de l'édition des liens, il y a toujours une erreur du type:

Code Cpp:

C:\Prog\Test_wx\Test_wxMain.cpp||In constructor 'Test_wxFrame::Test_wxFrame(wxFrame*, const wxString&)':|
C:\Prog\Test_wx\Test_wxMain.cpp|77|warning: unused variable 'pg'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_propgrid.o):propgrid.cpp||
     undefined reference to `wxOwnerDrawnComboBox::ms_classInfo'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_propgrid.o):propgrid.cpp||
     undefined reference to `wxOwnerDrawnComboBox::ms_classInfo'
|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_propgrid.o):propgrid.cpp||
     undefined reference to `wxOwnerDrawnComboBox::ms_classInfo'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_propgrid.o):propgrid.cpp||
     undefined reference to `wxOwnerDrawnComboBox::ms_classInfo'
|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp||
     undefined reference to `vtable for wxOwnerDrawnComboBox'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp||
     undefined reference to `vtable for wxOwnerDrawnComboBox'
|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp||
     undefined reference to `wxOwnerDrawnComboBox::Init()'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp||
     undefined reference to `wxOwnerDrawnComboBox::Create(wxWindow*, int, wxString const&,
     wxPoint const&, wxSize const&, wxArrayString const&, long, wxValidator const&, wxString const&)'
|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp||
     undefined reference to `wxOwnerDrawnComboBox::ms_classInfo'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp||
     undefined reference to `wxOwnerDrawnComboBox::ms_classInfo'
|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp:
     (.rdata$_ZTV12wxPGComboBox[vtable for wxPGComboBox]+0x8)||undefined reference
     to `wxOwnerDrawnComboBox::GetClassInfo() const'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp:
     (.rdata$_ZTV12wxPGComboBox[vtable for wxPGComboBox]+0x2c)||undefined reference
     to `wxOwnerDrawnComboBox::GetEventTable() const'
|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp:
     (.rdata$_ZTV12wxPGComboBox[vtable for wxPGComboBox]+0x30)||undefined reference
     to `wxOwnerDrawnComboBox::GetEventHashTable() const'|
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_editors.o):editors.cpp:
     (.rdata$_ZTV12wxPGComboBox[vtable for wxPGComboBox]+0x324)||undefined reference
     to `wxOwnerDrawnComboBox::DoSetPopupControl(wxComboPopup*)'
|
............
 
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 1 warnings ===|
 


J'ai bien ajouté la librairie libwxmsw28u_propgrid.a dans la liste des libs.

Ne sachant pas si le problème vient de la compilation de mes librairies, j'ai téléchargé celles disponibles sur ce site (celle de Xaviou): libs wxWidgets 2.8.11 et lib wxPropertyGrid 1.4.11.
Même erreur de "linkage".

Quelqu'un a-t-il déjà eu ce genre de soucis?

Merci
23-03-2011 20:04:06  Re: Erreur lors de l'édition des liens avec les lib wxPropertyGrid #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1191
Snippets: 23
Tutoriels: 6
Site web
Hors ligne
Salut.

A première vue, je dirait qu'il y a un conflit avec les paramètres de compilation et/ou de linkage.
C'est comme si, par exemple, tu essayais de linker ton exécutable avec une lib "dynamique" en ayant des paramètres de linkage pour une lib statique.

Si je trouve un peu de temps en fin de soirée, j'essayerais de compiler un petit projet de ce style pour voir.
Apparemment, tu utilises la version Unicode des libs, mais peux-tu indiquer les autres paramètres de configuration stp : Dynamique/Statique, Monolithique/Multilibs, Debug/Release.

@+
Xav'
----------
Re.

J'ai finalement trouvé le temps de faire le test (de toute façon, j'avais du le faire quand j'ai compilé les libs disponibles ici en téléchargement).

Je suis parti comme toi d'un simple projet Code::Blocks, avec les paramètres que j'utilise le plus souvent pour un projet wxWidgets : Unicode / Dynamique / Multi-libs
J'ai ajouté la même ligne que toi dans le constructeur de la frame pour créer un contrôle wxPropertyGrid.

J'ai ensuite ajouté l'include adéquat : #include <wx/propgrid/propgrid.h> pour que la compilation puisse s'effectuer sans problème, et enfin, j'ai ajouté la lib libwxmsw28u_propgrid.a dans les options du linker : tout c'est bien passé.

Par contre, j'ai ensuite fait d'autres tests, et j'ai réussi à reproduire ton problème.
Mais comme il se fait tard, je ne vais pas vous ennuyer avec ça maintenant... :lol:

Bon, ok, j'y viens...

En fait, je suis ensuite passé aux libs Unicode / Statique / Multi-libs, et j'ai obtenu les mêmes erreurs de linkage que toi.
Pour y remédier, il faut dans un premier temps ajouter la lib "adv" (dans mon cas : libwxmsw28u_adv.a, mais ça ne suffit pas à supprimer toutes les erreurs.
Il faut ensuite faire très attention à l'ordre dans lequel apparaissent les libs à linker à ton projet.
J'avais la liste suivante :

Code:

libwxmsw28u_core.a
libwxbase28u.a
libcomctl32.a
libole32.a
libgdi32.a
libuuid.a
libcomdlg32.a
liboleaut32.a
libwinspool.a
libwxmsw28u_propgrid.a
libwxmsw28u_adv.a

Il a en fait fallu que je remonte les deux dernières au début de la liste pour que ça marche.
Ne me demande pas pourquoi, je n'en sais rien. J'avais juste déjà remarqué que cet ordre avait une importance.
Ce qui donne donc comme liste :

Code:

libwxmsw28u_propgrid.a
libwxmsw28u_adv.a
libwxmsw28u_core.a
libwxbase28u.a
libcomctl32.a
libole32.a
libgdi32.a
libuuid.a
libcomdlg32.a
liboleaut32.a
libwinspool.a

Même en inversant les deux premières, ça foire.

Voilà, j'espère que ça résoudra ton problème.

@+
Xav'

P.S: Comme tu peux le constater, je me suis permis d'éditer ton post pour réduire l'affichage en largeur (c'est un bug du site que j'avais zappé : il faudra que je me repenche dessus un de ces quatre).

Dernière modification par Xaviou (23-03-2011 23:48:58)


Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
24-03-2011 12:52:35  Re: Erreur lors de l'édition des liens avec les lib wxPropertyGrid #3
ld13 (Nouveau membre)
Inscrit le : 11-12-2010
Messages: 6
Snippets: 0
Tutoriels: 0
Hors ligne
Bonne nouvelle, mon problème est résolu.
En effet, l'ordre d'inclusion des libs statiques a une importance, j'avais effectué comme toi différents essais en intervertissant l'ordre mais sans succès.

Merci et bonne journée à toi.
Laurent
24-03-2011 22:56:51  Re: Erreur lors de l'édition des liens avec les lib wxPropertyGrid #4
cubbiste (Membre)
Inscrit le : 14-07-2010
Messages: 11
Snippets: 0
Tutoriels: 0
Hors ligne
Xaviou a écrit:
Ne me demande pas pourquoi, je n'en sais rien. J'avais juste déjà remarqué que cet ordre avait une importance.
Pour l'édition de liens, le linker commence par analyser le code "local" de l'application, c'est à dire tous les xxx.o.
Pendant cette analyse, il construit la liste des "undefined references", c'est à dire la liste des fonctions appelées depuis ce code local et qui n'y sont pas définies.
Il cherche ensuite à résoudre ces "undefined references" par analyse des librairies libXxx.a, mais il le fait en s'économisant, en analysant chaque librairie une seule fois, et une à la fois.
Chaque fois qu'il parvient à résoudre une référence, il ajoute la code de la fonction à l'application, mais comme cette fonction risque d'appeler d'autres fonctions, il complète la liste des "undefined references".

Donc, si on lui donne la liste des librairies dans l'ordre libA.a, libB.a et libC.a :
- si libA.a utilise une fonction définie dans libB.a : cela fonctionne, car libA.a a d'abord été analysée, ce qui a permis d'identifier la fonction de libB.a à prendre avant de faire l'analyse de libB.a -> la fonction de libB.a sera bien liée dans l'application
- en revanche, si libB.A utilise une fonction définie dans libA.a : cela ne fonctionne pas, car le besoin de lier la fonction de libA.a n'est identifié que quand libB.a est analysé, et à ce stade il est trop tard pour trouver cette fonction dans libA.a.

Mais alors, comment faire pour déterminer l'ordre de librairies à utiliser ?
Il faut "simplement" utiliser les messages d'erreur du linker.

exemple :

Code:

 
C:\wxWidgets-2.8.11\lib\gcc_lib\libwxmsw28u_propgrid.a(propgrid_lib_propgrid.o):propgrid.cpp||
     undefined reference to `wxOwnerDrawnComboBox::ms_classInfo'|

Ce message indique que la librairie libwxmsw28u_propgrid.a fait référence à wxOwnerDrawnComboBox::ms_classInfo qui n'a pas été trouvée.
Il faut donc ajouter la librairie qui contient wxOwnerDrawnComboBox::ms_classInfo (apparemment, c'est libwxmsw28u_adv.a), et il faut que cet ajout se fasse APRES libwxmsw28u_propgrid.a.


Corolaire :
Si libA.a utilise une fonction de libB.a et libB.a utilise une fonction de libA.a --> on peut se trouver coincé. Cela prouve qu'il y a une dépendance en boucle entre les deux librairies, ce qui est probablement mauvais signe quant à la conception de ces librairies.
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Compilation - Installation - Réglages IDE
» Erreur lors de l'édition des liens avec les lib wxPropertyGrid