OVH Cloud OVH Cloud

Compilation avec Qt sous Cygwin

6 réponses
Avatar
Remi Moyen
Salut,

Ça concerne pas vraiment unix, sauf que Cygwin est quand même un petit peu
unixien, donc peut-être que quelqu'un aura une idée (j'avais posté
cette question sur fca.x11 il y a quelques jours, sans la moindre
réponse. Snif.)...

J'ai quelques applis (simples voire simplistes, mais passons) sous Linux,
avec interface graphique en Qt, dont je n'ai pas d'équivalent sous
Windows. J'aimerais les porter, et je profite de l'occasion pour utiliser
un peu sérieusement Cygwin, histoire de voir ce que ça vaut.

Je suis tombé (par hasard) sur http://kde-cygwin.sourceforge.net/, qui
propose -- en plus d'un portage de KDE, comme son nom l'indique -- un
portage de Qt/X11 (3.2). J'installe donc le paquet Qt
(http://kde-cygwin.sourceforge.net/qt3/download.php) , et j'ai bien la
libqt, et des applications Qt (designer, uic, moc, ...).

Mais par contre, pas moyen de linker un autre programme avec cette libqt !
Si je spécifie -lqt-mt (je compile avec c++), je n'ai pas de message
d'erreur (donc il trouve bien la libqt-mt, qui existe effectivement bien),
mais j'ai une chiée de messages d'erreur de ld (unresolved symbol) reliés
à Qt (QApplication, ...). En fait, que je mette ou non le -lqt-mt, j'ai
exactement les mêmes erreurs !

J'ai trouvé (http://kde-cygwin.sourceforge.net/faq/compiling.php) une page
qui me dit d'ajouter -Wl,--enable-auto-import lors du link par g++, mais
ça ne change strictement rien au résultat (mêmes messages d'erreur).

Je ne pense pas que ce soit un problème genre "j'ai installé libqt mais
pas libqt-dev", parce que d'une part j'ai des programmes typiquement de
développement (designer, moc, ...), mais en plus, j'ai bien la libqt-mt !
On dirait juste qu'elle est trouvée, mais pas utilisée, lors du link.

Je sais pas trop quoi chercher pour corriger ça, alors si quelqu'un a une
idée...

PS : je sais, il existe plein d'autres méthodes pour compiler sous Windows
un truc avec Qt, à commencer par utiliser Qt/Win32. Mais comme ce
programme me sert plus à apprendre comment ça marche qu'à simplement le
faire tourner, j'aimerais vraiment comprendre pourquoi ça marche pas avec
Cygwin.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

6 réponses

Avatar
Hugues
Ce cher Remi Moyen a dit :

Salut,

Ça concerne pas vraiment unix, sauf que Cygwin est quand même un peti t peu
unixien, donc peut-être que quelqu'un aura une idée (j'avais posté cette
question sur fca.x11 il y a quelques jours, sans la moindre réponse. Sn if.)...

J'ai quelques applis (simples voire simplistes, mais passons) sous Linux, avec
interface graphique en Qt, dont je n'ai pas d'équivalent sous
Windows. J'aimerais les porter, et je profite de l'occasion pour utiliser un
peu sérieusement Cygwin, histoire de voir ce que ça vaut.

Je suis tombé (par hasard) sur http://kde-cygwin.sourceforge.net/, qui propose
-- en plus d'un portage de KDE, comme son nom l'indique -- un portage de
Qt/X11 (3.2). J'installe donc le paquet Qt
(http://kde-cygwin.sourceforge.net/qt3/download.php) , et j'ai bien la li bqt,
et des applications Qt (designer, uic, moc, ...).

Mais par contre, pas moyen de linker un autre programme avec cette libqt ! Si
je spécifie -lqt-mt (je compile avec c++), je n'ai pas de message d'err eur
(donc il trouve bien la libqt-mt, qui existe effectivement bien), mais j' ai
une chiée de messages d'erreur de ld (unresolved symbol) reliés à Qt
(QApplication, ...). En fait, que je mette ou non le -lqt-mt, j'ai exacte ment
les mêmes erreurs !

J'ai trouvé (http://kde-cygwin.sourceforge.net/faq/compiling.php) une p age qui
me dit d'ajouter -Wl,--enable-auto-import lors du link par g++, mais ça ne
change strictement rien au résultat (mêmes messages d'erreur).



Peut être as tu oublié de rajouter l'option -L<chemin vers les libs Qt> au
moment du link ?
C'est la première chose à laquelle je pense en lisant ton po st, et
probablement la seule raison que j'y vois...

--
Hugues - Debianiste avant tout - http://www.nullpart.net/~hugues/Linux/

Avatar
Remi Moyen
On Tue, 31 May 2005, Hugues wrote:

Mais par contre, pas moyen de linker un autre programme avec cette libqt ! Si
je spécifie -lqt-mt (je compile avec c++), je n'ai pas de message d'erreur
(donc il trouve bien la libqt-mt, qui existe effectivement bien), mais j'ai
une chiée de messages d'erreur de ld (unresolved symbol) reliés à Qt
(QApplication, ...). En fait, que je mette ou non le -lqt-mt, j'ai exactement
les mêmes erreurs !


Peut être as tu oublié de rajouter l'option -L<chemin vers les libs Qt> au
moment du link ?


Non. Je l'ai pas précisé, mais je l'avais bien mis (je pense que sinon, il
m'aurait dit qu'il ne pouvait pas trouver libqt-mt.so, non ?).

Je pense que ça doit être une viciosité de Cygwin (ce que me confirme
vaguement l'histoire de enable-auto-import), mais quoi ?

C'est la première chose à laquelle je pense en lisant ton post, et
probablement la seule raison que j'y vois...


Et c'est pas ça. Snif. Merci quand même.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."


Avatar
Hugues
Ce cher Remi Moyen a dit :

On Tue, 31 May 2005, Hugues wrote:

Peut être as tu oublié de rajouter l'option -L<chemin vers les li bs Qt> au
moment du link ?


Non. Je l'ai pas précisé, mais je l'avais bien mis (je pense que sino n, il
m'aurait dit qu'il ne pouvait pas trouver libqt-mt.so, non ?).


Non, il t'aurait mis plein d'"unresolved symbol".
Mais si tu affirmes l'avoir fait, je suis desole de ne pouvoir t'aider :-/.

Je pense que le mieux serait que tu ailles voir sur le site officiel de cyg win
ou rapprochants. Par exemple, un petit coup de google sur cygwin et li bqt
devrait te donner des pistes, non ?

--
Hugues - Debianiste avant tout - http://www.nullpart.net/~hugues/Linux/


Avatar
Gilles Civario
Remi Moyen wrote:
Salut,

Ça concerne pas vraiment unix, sauf que Cygwin est quand même un petit
peu unixien, donc peut-être que quelqu'un aura une idée (j'avais posté
cette question sur fca.x11 il y a quelques jours, sans la moindre
réponse. Snif.)...

J'ai quelques applis (simples voire simplistes, mais passons) sous
Linux, avec interface graphique en Qt, dont je n'ai pas d'équivalent
sous Windows. J'aimerais les porter, et je profite de l'occasion pour
utiliser un peu sérieusement Cygwin, histoire de voir ce que ça vaut.

Je suis tombé (par hasard) sur http://kde-cygwin.sourceforge.net/, qui
propose -- en plus d'un portage de KDE, comme son nom l'indique -- un
portage de Qt/X11 (3.2). J'installe donc le paquet Qt
(http://kde-cygwin.sourceforge.net/qt3/download.php) , et j'ai bien la
libqt, et des applications Qt (designer, uic, moc, ...).

Mais par contre, pas moyen de linker un autre programme avec cette libqt
! Si je spécifie -lqt-mt (je compile avec c++), je n'ai pas de message
d'erreur (donc il trouve bien la libqt-mt, qui existe effectivement
bien), mais j'ai une chiée de messages d'erreur de ld (unresolved
symbol) reliés à Qt (QApplication, ...).


As tu fait un nm sur la bibliothèqye en question pour verifier si les symboles
non trouvés au link y sont bien définis ?
Autre possibilité, tu n'as pas mis ton -lqt-mt à la bonne place dans la commande
de link. Ajoute le en dernière position.

Sinon, quel est la ligne de link ?
Quel est le message d'erreur.
Que te donne un 'nm -o lib* | grep <un-symnole-non-trouvé>' dans le répertoire
des bibliothèques Qt ?

Dernière piste : Cygwin, ça tourne sous Windows ( si si ;-) ). En sous Windows,
les éditions de liens dynamiques se font sur les bibliothèques d'import (les .LIB),
pas sur les bibliothèques elles-mêmes. C'est pourquoi, pendant longtemps, il était
très difficile de linker dynamiquement sous Cygwin.
Je ne sais pas comment cela à évolué, mais le fait est que depuis quelques années,
c'est devenu possible simplement à la mode Unix. Mais ça, c'est vrais dans la branche
principale du projet. Comment cela se passe dans la branche qui fait le portage
de Qt et KDE, je n'en sais rien... Donc, si tout foire par ailleurs, essaye de link
avec les .LIB plutôt que les .so.

Gilles

Avatar
Remi Moyen
On Tue, 31 May 2005, Hugues wrote:

Peut être as tu oublié de rajouter l'option -L<chemin vers les libs Qt> au
moment du link ?


Non. Je l'ai pas précisé, mais je l'avais bien mis (je pense que sinon, il
m'aurait dit qu'il ne pouvait pas trouver libqt-mt.so, non ?).


Non, il t'aurait mis plein d'"unresolved symbol".


Si j'avais mis le -lqt-mt mais pas le -L/path/to/qt/lib ? Tiens, ce n'est
pas ce à quoi je me serais attendu.

Mais si tu affirmes l'avoir fait, je suis desole de ne pouvoir t'aider :-/.


Bah, tant pis. En fait, j'ai fini par résoudre plus ou moins le problème
en recompilant moi-même un qt depuis les sources. J'aurais préféré éviter,
mais bon.

Une explication possible me semble donc que la libqt binaire n'avait pas
été compilée avec la même version de gcc que celle que j'utilise, mais ça
m'étonne un peu (rien n'indique sur le site de kde-cygwin que la version
de gcc soit autre qu'un gcc 3 récent, celui qui est distribué avec
Cygwin). D'autant plus que différents essais avec g++ -V 2-quelquechose
n'ont pas résolu le problème. Mais bon, comme j'ai trouvé une autre
solution...

Je pense que le mieux serait que tu ailles voir sur le site officiel de cygwin
ou rapprochants. Par exemple, un petit coup de google sur cygwin et libqt
devrait te donner des pistes, non ?


Bof. J'avais essayé, mais y'a surtout des milliers de messages sur comment
compiler Qt sous Cygwin. J'avais rien trouvé de probant à ce sujet.

Merci quand même.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."



Avatar
Remi Moyen
On Wed, 1 Jun 2005, Gilles Civario wrote:

Je suis tombé (par hasard) sur http://kde-cygwin.sourceforge.net/, qui
propose -- en plus d'un portage de KDE, comme son nom l'indique -- un
portage de Qt/X11 (3.2). J'installe donc le paquet Qt
(http://kde-cygwin.sourceforge.net/qt3/download.php) , et j'ai bien la
libqt, et des applications Qt (designer, uic, moc, ...).

Mais par contre, pas moyen de linker un autre programme avec cette libqt !
Si je spécifie -lqt-mt (je compile avec c++), je n'ai pas de message
d'erreur (donc il trouve bien la libqt-mt, qui existe effectivement bien),
mais j'ai une chiée de messages d'erreur de ld (unresolved symbol) reliés à
Qt (QApplication, ...).


As tu fait un nm sur la bibliothèqye en question pour verifier si les
symboles
non trouvés au link y sont bien définis ?


Non, mais les symboles manquants sont des trucs basics de Qt (genre
QApplication::translate(...)). Si ils n'existaient pas dans cette
libqt, c'est qu'elle est sacrement pourriement construite !

Autre possibilité, tu n'as pas mis ton -lqt-mt à la bonne place dans la
commande
de link. Ajoute le en dernière position.


Tiens, il me semblait que la position sur la ligne de commande n'importait
pas ? Enfin, de toute façon, non, ça ne change rien.

Sinon, quel est la ligne de link ?
Quel est le message d'erreur.
Que te donne un 'nm -o lib* | grep <un-symnole-non-trouvé>' dans le
répertoire
des bibliothèques Qt ?


J'ai pas la machine sous les yeux, mais une ligne de compil de ce genre
foirait :

c++ -c -I/opt/qt/3.2/include -oessai_qt.o essai_qt.cpp
[ça, ça marchait -- forcément, c'est la compilation et pas le link]

c++ -L/opt/qt/3.2/lib -lqt-mt -oessai_qt essai_qt.o

Ça, ça plantait, les premiers messages étant (tiens, j'avais gardé un
log, moi...) :

essai_qt.o(.text+0x47):essai_qt.cpp: undefined reference to
`QApplication::translate(char const*, char const*, char const*,
QApplication::Encoding) const'

suivi d'autres "undefined reference" à la pelle (la plupart relatifs à
QApplication et QWidget), sauf tout à la fin, où j'ai :

Info: resolving _qApp by linking to __imp__qApp (auto-import)
collect2: ld returned 1 exit status

Voir mon autre message, je soupçonne des compilations avec des versions de
gcc différentes, mais ça ne m'a pas aidé à résoudre le problème.

Bon, j'ai fini par régler le problème en recompilant moi-même un Qt
complet. J'aurais préféré éviter, mais peu importe, ça marche maintenant.

Notons que, même avec un Qt compilé moi-même, j'ai aussi une poignée
(entre 5 et 10, suivant les programmes) de messages "Info: resolving
blabla by linking to __imp__blabla". Mais, comme leur nom l'indique, ce ne
sont que des infos, le link marche bien et l'executable aussi.

(par contre, qu'est-ce que c'est lent !)

Dernière piste : Cygwin, ça tourne sous Windows ( si si ;-) ). En sous
Windows, les éditions de liens dynamiques se font sur les bibliothèques
d'import (les .LIB), pas sur les bibliothèques elles-mêmes. C'est
pourquoi, pendant longtemps, il était très difficile de linker
dynamiquement sous Cygwin.


D'après divers exemples sur le net, et quelques essais avec une lib
triviale faite à la main, non, pas de problèmes pour linker avec des .so.
D'ailleurs, ça marche bien avec les .so en recompilant Qt, donc je ne
crois pas que c'était ça.

Merci quand même pour tes réponses !
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."