Erreur de compilation et options de compilation - C++ - Programmation
Marsh Posté le 19-10-2004 à 16:30:03
correction (problème d'image) :
il faut lire :
main.C : 12 : 'round' undeclared (first use this function)
Marsh Posté le 19-10-2004 à 16:37:15
c'est possible que tu n'ais pas round, c'est pas dans le standard (moi j'ai jamais vu)
mais ca se fais facilement avec floor/ceil
j'ai deja vu rint aussi mais c'est pas standard
Marsh Posté le 19-10-2004 à 16:46:22
OK, je suis d'accord que ça n'est peut-être pas standard mais ce qui m'inquiète c'est que avec mon compilateur g++3.3.2, cette fonction est reconnue sans problème (et la norme n'a pas du bcp changer).
Je pense plutot être passé à coté de qqch quand j'ai essayé de compiler avec la version g++2.96. D'autant qu'il y qqs jours cela fonctionnait encore avec g++2.96, avant que je ne m'amuse à installer une version plus récente de g++.
Marsh Posté le 19-10-2004 à 17:55:06
Utilise les balises [cpp] la prochaine fois plz.
Marsh Posté le 19-10-2004 à 18:13:08
L'ABI a changé entre g++ 2.96 et 3.X.
Le linker ne trouve donc pas les symboles, car la décoration des noms n'est pas la même.
Solution: soit tu compiles tout avec la 2.96, soit tu compiles tout avec la 3.3.2 (y compris tes libs QT).
Marsh Posté le 19-10-2004 à 18:24:02
Excuse moi, mais je suis novice.
Est ce que tu parles de mon problème avec round ou avec Qt ?
Qu'est ce que l'ABI ?
Que sont ces symboles que l'édition de lien ne retrouvent pas ?
Et si j'essaye de tout recompiler avec la 3.3.2, y compris Qt, ce sera pour avoir les longs messages d'erreur dont je t'ai parlé. En quoi consisterait le fait de tout recompiler, y compris Qt, pour toi ? N'est ce pas ce que je fais déja ? Comment procéder ?
Excusez d'avance mes questions de débutant.
Marsh Posté le 19-10-2004 à 18:34:31
Déjà, tu lis ça:
http://www.redhat.com/docs/manuals [...] ility.html
Et sinon, mon truc s'addresse à tes problèmes de "longs messages d'erreurs". Recompiler QT, ça veut dire downloader QT, et recompiler le tout, et pas seulement ton appli. Mais je ne peux pas te dire si c'est la solution à faire ici...
Tu devrais poser la question aussi sur le forum OS Alternatifs, ils sauront mieux que moi comment faire tourner simultanément plusieurs versions des libs QT.
Marsh Posté le 19-10-2004 à 16:29:07
Voila,
Je ne suis pas administrateur sur ma machine et j'ai voulu faire joujou avec gcc en installant sur mon compte une version plus récente (la 3.3.2) à l'adresse ~/toto et éviter d'utiliser l'ancienne (la 2.96).
Le problème c'est que je me retrouve avec deux programmes qui ne sont plus compilables simultanément sous les deux versions, alors que précédemment j'arrivais à les compiler au moins sous l'ancienne.
Le premier est compilable avec la 2.96 et pas la 3.3.2 et fait appel à Qt :
#include <qapplication.h>
#include <qlabel.h>
int main( int argc, char **argv )
{
QApplication myapp( argc, argv );
QLabel* myLabel = new QLabel("Hello World!",0,"my hello" );
myLabel->setGeometry(400,300,120,90);
myapp.setMainWidget(myLabel);
myLabel->show();
return myapp.exec();
}
avec la version 2.96, la commande :
g++ -O -o main main.C -I/repqt/include -L/repqt/lib -lqt
fonctionne et me donne le résultat attendu (repqt fait référence au chemin où j'ai installé Qt).
Si j'essaye d'utiliser la version 3.3.2 (remplacement de g++ par l'adresse du binaire lançant l'éxécution du compilateur) que j'ai installé, la même commande donne le résultat :
/tmp/ccrBgMqt.o: In function `main':
/tmp/ccrBgMqt.o(.text+0x27): undefined reference to `QApplication::QApplication[in-charge](int&, char**)'
/tmp/ccrBgMqt.o(.text+0x4c): undefined reference to `QString::QString[in-charge](char const*)'
/tmp/ccrBgMqt.o(.text+0x70): undefined reference to `QLabel::QLabel[in-charge](QString const&, QWidget*, char const*, unsigned)'
/tmp/ccrBgMqt.o(.text+0x8a): undefined reference to `QString::shared_null'
....
/tmp/ccrBgMqt.o(.gnu.linkonce.r._ZTV6QGList+0xc): undefined reference to `QGList::clear()'
/tmp/ccrBgMqt.o(.gnu.linkonce.r._ZTV6QGList+0x10): undefined reference to `QGList::~QGList [in-charge]()'
/tmp/ccrBgMqt.o(.gnu.linkonce.r._ZTV6QGList+0x14): undefined reference to `QGList::~QGList [in-charge deleting]()'
....
collect2: ld returned 1 exit status
(les ... correspondent à des lignes similaires).
D'où vient l'erreur ? Est ce qu'il manque une ligne à la compilation ? En fait, est ce qu'il faut que je rajoute qqch pour permettre au compilateur de trouver l'adresse des librairies Qt (pourtant une commande de compilation écrite de manière similaire fonctionnait avec la précédente version de g++) ? J'espère également que mes variables d'environnement, notamment LD_LIBRARY_PATH, sont bien définies.
L'autre programme que j'ai est encore plus simple :
#include <math.h>
#include <iostream>
using namespace std;
int main()
{
....
cout << round (5.6) << endl;
....
}
En utilisant le précédent compilateur (2.96), la fonction round n'est bizarrement pas trouvée :
main.C:12: 'round' undeclared (first use this function)
avec la commande : g++ -O -o main main.C
le compilateur 3.3.2 ne pose pas de problème et donne le résultat attendu.
Vous l'aurez peut-être compris, en fait, le vrai programme que je cherche à utiliser fait appel à Qt et à la fonction round. Je ne parviens pas à le compiler avec l'une ou l'autre des versions de mon compilateur.
D'avance merci de vos réponse à ce (long) message,
Nathan g