Courbes avec Qwt (erreur de segmentation)

Courbes avec Qwt (erreur de segmentation) - C++ - Programmation

Marsh Posté le 09-04-2008 à 00:19:04    

Bonjour à tous!
 
J'essaye de tester Qwt. Pour cela j'ai utilisé le bout de code qui était proposé dans le tutoriel du site pour créer une petite classe. Cependant j'ai une erreur de segmentation au moment de l'execution.
 
Je vous met le code
 

Code :
  1. #include <QtGui>
  2. #include <qwt_plot.h>
  3. #include <qwt_plot_curve.h>
  4. #include <iostream>
  5. using namespace std;
  6. class Window : public QWidget
  7. {
  8.         public:
  9.         Window() :  x (100), y1(100), y2(100)
  10.        {
  11.            QwtPlot *myPlot = new QwtPlot(QwtText("Two Curves" ), this);
  12.          
  13.            // add curves
  14.            QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1" );
  15.            QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2" );
  16.            for(int i=0; i<100; i++)
  17.           {
  18.                x[i]  = i;
  19.                y1[i] = i;
  20.                y2[i] = 100 - i;
  21.            }
  22.          
  23.            // copy the data into the curves
  24.            curve1->setData(x.data(), y1.data(), 100);
  25.            curve2->setData(x.data(), y2.data(), 100);
  26.            curve1->attach(myPlot);
  27.            curve2->attach(myPlot);
  28.          
  29.            // finally, refresh the plot
  30.            myPlot->replot();
  31.          
  32.            //setFixedSize(myPlot->sizeHint());
  33.        }
  34.       private:
  35.        QVector<double> x;
  36.        QVector<double> y1;
  37.        QVector<double> y2;
  38.    };
  39.  
  40.    int main(int argc, char **argv)
  41.    {
  42.        QApplication app(argc, argv);
  43.        Window w;
  44.        w.show();
  45.        return app.exec();
  46.    }


 
Pouvez-vous m'aider s'il vous plait.

Reply

Marsh Posté le 09-04-2008 à 00:19:04   

Reply

Marsh Posté le 09-04-2008 à 00:49:49    

J'ai cru comprendre d'où viens l'erreur de segmentation. C'est quand je modifie mon Fichier.pro
 
Voici le fichier.pro lorsque l'erreur de segmentation survient:
 
######################################################################
# Automatically generated by qmake (2.01a) mer. avr. 9 00:34:42 2008
######################################################################
 
TEMPLATE = app
TARGET =  
DEPENDPATH += .
INCLUDEPATH += . /usr/local/qwt-5.0.2/include
LIBS += -L/usr/local/qwt-5.0.2/lib -lqwt  
 
# Input
SOURCES += main.cc
 
 
Et en fait je pense que la ligne qui pose problème c'est celle-ci :
LIBS += -L/usr/local/qwt-5.0.2/lib -lqwt  
 
Car j'ai fait quelque test et c'est quand je rajoute cette ligne ça fait automatiquement une erreur de segmentation (je l'ai essayé sur un programme qui n'utilise pas Qwt et qui fonctionne).
 
Cependant si je fais le même fichier.pro juste avec cette ligne en moins j'ai l'erreur suivante :  
 
main.o: In function `Window':
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtText::QwtText(QString const&, QwtText::TextFormat)'
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtPlot::QwtPlot(QwtText const&, QWidget*)'
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtText::~QwtText()'
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtText::~QwtText()'
/home/benoit/C++/testPlot3/main.cc:15: undefined reference to `QwtPlotCurve::QwtPlotCurve(QString const& )'
/home/benoit/C++/testPlot3/main.cc:16: undefined reference to `QwtPlotCurve::QwtPlotCurve(QString const& )'
/home/benoit/C++/testPlot3/main.cc:25: undefined reference to `QwtPlotCurve::setData(double const*, double const*, int)'
/home/benoit/C++/testPlot3/main.cc:26: undefined reference to `QwtPlotCurve::setData(double const*, double const*, int)'
/home/benoit/C++/testPlot3/main.cc:27: undefined reference to `QwtPlotItem::attach(QwtPlot*)'
/home/benoit/C++/testPlot3/main.cc:28: undefined reference to `QwtPlotItem::attach(QwtPlot*)'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [testPlot3] Erreur 1      
 
Je ne comprend pas.
 
Franchement si quelqu'un peut m'aider à utiliser Qwt je le remercie vivement.

Reply

Marsh Posté le 09-04-2008 à 01:10:24    

ils sont où les delete qui vont avec les new ?

Reply

Marsh Posté le 09-04-2008 à 01:16:58    

Je les ai oublié (en fait ce n'est pas moi qui ai fait le programme), mais je ne pense pas que le problème vienne de là .

Reply

Marsh Posté le 09-04-2008 à 01:21:59    

benito59650 a écrit :

J'ai cru comprendre d'où viens l'erreur de segmentation. C'est quand je modifie mon Fichier.pro


Nan, pas vraiment non :D
 

benito59650 a écrit :

Et en fait je pense que la ligne qui pose problème c'est celle-ci :
LIBS += -L/usr/local/qwt-5.0.2/lib -lqwt  
 
Car j'ai fait quelque test et c'est quand je rajoute cette ligne ça fait automatiquement une erreur de segmentation (je l'ai essayé sur un programme qui n'utilise pas Qwt et qui fonctionne).


  • est-ce que le .so de qwt est dans un path listé dans /etc/ld.so.conf ? Si tu as eu besoin de l'éditer, as-tu bien lancé ldconfig juste après?
  • est-ce que tu as tenté de compiler en release et non en debug ou l'inverse? (déjà eu des surprises sous win; ça s'applique peut-être pas sur linux mais bon...)


benito59650 a écrit :

Cependant si je fais le même fichier.pro juste avec cette ligne en moins j'ai l'erreur suivante :

Citation :

main.o: In function `Window':
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtText::QwtText(QString const&, QwtText::TextFormat)'
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtPlot::QwtPlot(QwtText const&, QWidget*)'
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtText::~QwtText()'
/home/benoit/C++/testPlot3/main.cc:12: undefined reference to `QwtText::~QwtText()'
/home/benoit/C++/testPlot3/main.cc:15: undefined reference to `QwtPlotCurve::QwtPlotCurve(QString const& )'
/home/benoit/C++/testPlot3/main.cc:16: undefined reference to `QwtPlotCurve::QwtPlotCurve(QString const& )'
/home/benoit/C++/testPlot3/main.cc:25: undefined reference to `QwtPlotCurve::setData(double const*, double const*, int)'
/home/benoit/C++/testPlot3/main.cc:26: undefined reference to `QwtPlotCurve::setData(double const*, double const*, int)'
/home/benoit/C++/testPlot3/main.cc:27: undefined reference to `QwtPlotItem::attach(QwtPlot*)'
/home/benoit/C++/testPlot3/main.cc:28: undefined reference to `QwtPlotItem::attach(QwtPlot*)'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [testPlot3] Erreur 1



Ca c'est des erreurs de liaison dû au fait que tu ne lies pas avec Qwt, donc le code est inconnu.
 

bjone a écrit :

ils sont où les delete qui vont avec les new ?


Ils sont gérés par Qt et Qwt, pas de cheveux blancs à se faire ;)

Reply

Marsh Posté le 09-04-2008 à 01:58:22    

Tiens bonsoir IrmatDen. Comment ça va depuis le temps?
Juste au cas où tu te souviendrias plus, 'est ton code que je viens de poster (enfin quasiment). Je n'est quasiment plus touché à Qwt depuis la dernière fois qu'on s'est parlé sur le forum. J'ai fais un peu de Qt pour voir comment ça fonctionné.
 
Sinon pour ce qui est du .so il n'est pas dans /etc/ld.so.conf.d
 
J'ai un ami qui m'avais fait un lien symbolique sur un de mes libqwt.so... et ça m'avait permis de compiler.
 
Franchement je ne sais pas quoi faire

Reply

Marsh Posté le 09-04-2008 à 02:05:57    

Ah oui je n'est compilé que de manière "classique" avec Qt car je ne sais pas compiler en release ou en debug (enfin l'un ou l'autre).

Reply

Marsh Posté le 09-04-2008 à 14:57:57    

Ah, j'avais pas reconnu :D

 

Bon, step by step:
1. download de Qwt

 

2. qmake && make && sudo make install dans le répertoire de qwt

 

2.bis > ça installe le tout dans /usr/local/qwt-5.0.2 (par défaut), avec les so et autres liens dans le sous répertoire lib

 

3. création d'un qwt.conf dans /etc/ld.so.conf.d dont le contenu est:

Code :
  1. # qwt default configuration
  2. /usr/local/qwt-5.0.2/lib


(A voir si ta distrib gère ça comme la mienne, ie /etc/ld.so.conf fait juste un include ld.so.conf.d/*.conf. Sinon, tu as juste à ajouter le répertoire dans ld.so.conf)
suivi d'un:

Code :
  1. sudo ldconfig
 

4. on teste une première fois la compil+exécution des exemples (on est toujours dans ton répertoire qwt):

Code :
  1. cd examples/simpleplot
  2. qmake && make
  3. ./simple


Si ça ne marche pas, il y a eu un raté sur une étape précédente, sinon, c'est parti, on fait notre propre projet

 

-- Création des liens nécessaire à la compilation d'un projet perso sans référencer le dossier d'origine de qwt --
5. on fait les liens symboliques des include:

Code :
  1. sudo ln -s /usr/local/qwt-5.0.2/include/* /usr/local/include/
 

6. Même chose pour les lib:

Code :
  1. sudo ln -s /usr/local/qwt-5.0.2/lib/* /usr/local/lib/
 

7. Le projet tel qu'il doit être:

  • qwt.pro:
Code :
  1. ######################################################################
  2. # Automatically generated by qmake (2.01a) mar. 12. févr. 20:44:52 2008
  3. ######################################################################
  4. TEMPLATE = app
  5. TARGET =
  6. DEPENDPATH += .
  7. INCLUDEPATH += .
  8. LIBS += -lqwt
  9. # Input
  10. SOURCES += main.cpp


  • main.cpp:
Code :
  1. #include <qwt_plot.h>
  2. #include <qwt_plot_curve.h>
  3. #include <QtGui>
  4. class Window : public QWidget
  5. {
  6. public:
  7.     Window()
  8.     :valueCount(100), x (valueCount), y1(valueCount), y2(valueCount)
  9.     {
  10.         QwtPlot *myPlot = new QwtPlot(QwtText("Two Curves" ), this);
  11.        
  12.         // add curves
  13.         QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1" );
  14.         QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2" );
  15.         createCurveData();
  16.        
  17.         // copy the data into the curves
  18.         curve1->setData(x.data(), y1.data(), 100);
  19.         curve2->setData(x.data(), y2.data(), 100);
  20.         curve1->attach(myPlot);
  21.         curve2->attach(myPlot);
  22.        
  23.         // finally, refresh the plot
  24.         myPlot->replot();
  25.        
  26.         setFixedSize(myPlot->sizeHint());
  27.     }
  28.    
  29. private:
  30.     void createCurveData()
  31.     {
  32.         for(int i=0; i<valueCount; i++)
  33.         {
  34.             x[i]   = i;
  35.             y1[i] = i;
  36.             y2[i] = 100 - i;
  37.         }
  38.     }
  39.    
  40. private:
  41.     const int valueCount;
  42.     QVector<double> x;
  43.     QVector<double> y1;
  44.     QVector<double> y2;
  45. };
  46. int main(int argc, char **argv)
  47. {
  48.     QApplication app(argc, argv);
  49.     Window w;
  50.     w.show();
  51.     return app.exec();
  52. }
 

8. on compile:

Code :
  1. qmake && make && ./qwt
 

Et là tu devrais avoir ta fenêtre avec 2 droites qui se croisent. En tout cas, ça marche nickel chez moi ça, mais pense à repartir éventuellement de 0 histoire que ce soit clean (si des manips déjà faites ont mis le bazar).

 


Edit: tu peux aussi changer l'INSTALLBASE unix dans qwtconfig.pri si tu veux te passer des liens symboliques, toute la démarche précédente est là dans le cadre de la config par défaut.


Message édité par IrmatDen le 09-04-2008 à 15:13:15
Reply

Marsh Posté le 09-04-2008 à 19:32:36    

Tout d'abord merci beaucoup pour m'avoir tout expliqué étape par étape.
J'ai donc recommencé depuis zero. J'ai bien réalisé toutes les étapes, mais j'ai toujours cette erreur de sgmentation lorsque je compile (mais les exemples fonctionnent bien)
 
Le qwt.pro il se fait tout seul quand tu tapes qmake -project (enfin moi c'est qmake-qt4)? ensuite il faut simplement le modifier?
 
Sinon j'ai bien créer un qwt.conf que j'ai mis dans le bon dossier.
 
Je comprends pas et toi?

Reply

Marsh Posté le 09-04-2008 à 19:50:50    

Mais bon quand je dis que j'ai tout repris depuis le début, je veux dire que j'ai relancé l'installation depuis la première étape que tu as cité, mais je n'ai pas supprimé la librairie préalablement, je sais pas si c'est important...

Reply

Marsh Posté le 09-04-2008 à 19:50:50   

Reply

Marsh Posté le 09-04-2008 à 22:38:16    

Le segfault tu l'as lorsque tu compiles ou lorsque tu exécutes?? (La première possibilité m'étonnes quelque peu quand même...)
Le mieux a faire serait d'utiliser gdb pour obtenir un peu plus d'infos sur la localisation du crash. Sinon, je vois pas comment résoudre le problème (même avec, n'étant pas vraiment utilisateur de linux ça risque d'être dur...)
 
Le mieux serait tout de même de repartir de la config la plus saine possible, si possible sans la moindre trace de qwt; je ne sais pas ce que tu veux dire par le dernier post.

Reply

Marsh Posté le 12-04-2008 à 00:06:22    

L'erreur arrive au moment de l'execution.
Je vais essayer de supprimer toute trace de qwt et de recommencer. Merci

Reply

Marsh Posté le 12-04-2008 à 08:37:43    

+1 pour gdb


---------------
Töp of the plöp
Reply

Marsh Posté le 12-04-2008 à 16:00:28    

J'ai essayé gdb mais de manière très simpliste (car je ne connaissait pas).
J'ai donc fait le test simple suivant :  
 
dans le répertoire (qui s'appelle qwt) de mon programme j'ai tapé:
 
$ gdb qwt core
(gdb) r
 
voici l'erreur qui s'affiche :
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1234352448 (LWP 7003)]
0xb6ce1fa8 in QShared::ref () from /usr/lib/libqt-mt.so.3
 
Ca vous dit quelque chose?

Reply

Marsh Posté le 12-04-2008 à 17:16:45    

Tu peux copier le résultat de bt dans gdb stp? (Ca indiquera la pile d'appel)
 
Parce que là on voit pas pourquoi le compteur part dans les choux, donc c'est un peu pas instructif :P

Reply

Marsh Posté le 12-04-2008 à 17:56:44    

Excuse moi mais je comprend pas ce que tu me dis. C'est quoi le resultat de bt? comment on le copie dans gdb?

Reply

Marsh Posté le 12-04-2008 à 18:40:09    

Pardon, en décrypté ça donne:
Peux-tu copier ici le résultat de la commande bt à taper dans gdb (après le crash)?

Reply

Marsh Posté le 12-04-2008 à 19:05:06    

Ah d'accord c'est plus clair :-)
Voilà

Code :
  1. (gdb) bt
  2. #0  0xb6ce4fa8 in QShared::ref () from /usr/lib/libqt-mt.so.3
  3. #1  0xb6ce6e9a in QString::QString () from /usr/lib/libqt-mt.so.3
  4. #2  0xb70d617f in ?? () from /usr/lib/libqt-mt.so.3
  5. #3  0xb7296358 in ?? () from /usr/lib/libqt-mt.so.3
  6. #4  0x0000ffff in ?? ()
  7. #5  0xb72926c0 in ?? () from /usr/lib/libqt-mt.so.3
  8. #6  0x0000ffff in ?? ()
  9. #7  0x00000001 in ?? ()
  10. #8  0xb72848d0 in ?? () from /usr/lib/libqt-mt.so.3
  11. #9  0xbf8bcf68 in ?? ()
  12. #10 0xb70d624f in ?? () from /usr/lib/libqt-mt.so.3
  13. #11 0xff0a0000 in ?? ()
  14. #12 0xb74fdff4 in ?? () from /usr/lib/libstdc++.so.6
  15. ---Type <return> to continue, or q <return> to quit---

Reply

Marsh Posté le 12-04-2008 à 19:11:31    

désolé j'ai oublié des lignes
 

Code :
  1. ---Type <return> to continue, or q <return> to quit---
  2. #13 0xbf8bcf78 in ?? ()
  3. #14 0xb718cd16 in ?? () from /usr/lib/libqt-mt.so.3
  4. #15 0xb72848d0 in ?? () from /usr/lib/libqt-mt.so.3
  5. #16 0xb7297000 in ?? ()
  6. #17 0xbf8bcf88 in ?? ()
  7. #18 0xb6c9a8ac in _init () from /usr/lib/libqt-mt.so.3
  8. Backtrace stopped: previous frame inner to this frame (corrupt stack?)

Reply

Marsh Posté le 12-04-2008 à 19:34:49    

Juste un petite précision sur le fichier qwt.conf :  
C'est bien un simple fichier texte dans lequel je copie :
 
# qwt default configuration
/usr/local/qwt-5.0.2/lib
 
et que j'enregistre avec le nom qwt.conf dans le repertoire /etc/ld.so.conf.d  ?
 
Comment je sais que ma config gère ça comme ça et non de l'autre manière que tu as décrite? (d'ailleurs je n'ai pas compris ce qu'il fallait faire pour l'autre méthode)

Reply

Marsh Posté le 13-04-2008 à 01:56:28    

Apparemment, c'est les libs Qt3 qui sont utilisées et non les Qt4, donc forcément, ça le fait pas.
* Comment as-tu installé Qt4 ? Paquet officiel ou compil des sources?
* As-tu installé un paquet de dev pour Qt3 ?

 

edit:

Citation :

Comment je sais que ma config gère ça comme ça et non de l'autre manière que tu as décrite?


Comme je l'ai dit plus haut: si /etc/ld.so.conf contient une ligne "include /etc/ld.so.conf.d/*.conf"


Message édité par IrmatDen le 13-04-2008 à 01:57:55
Reply

Marsh Posté le 13-04-2008 à 10:49:46    

j'ai installé les paquets pour installé Qt4 et je pense que j'ai installé Qt3 également. En fait j'ai fait le bourrin et j'ai fait sudo apt-get install pour tous les paquets qu'on me proposé. (du coup quand je compile je dois faire des qmake-qt4).
Que faire?

Reply

Marsh Posté le 13-04-2008 à 13:43:12    

Nettoie déjà en virant les paquets de dev Qt3... ensuite tu recompiles complétement. Mais ça doit être un tel foutoir que je doute pouvoir te dire quoi faire pour le remettre sur pied...

Reply

Marsh Posté le 16-04-2008 à 17:26:37    

Salut
 
Bon j'ai une bonne nouvelle pour toi!! Ca y est j'ai fini de te harceler avec mes posts. Ca marche enfin.
 
Quand je vais te dire le problème tu vas tomber à terre. En fait au moment d'intaller la librairie qwt, il fallait aller dans le repertoire de qwt-5.0.2 et taper : qmake-qt4 && make && sudo make install (et pas qmake && make && sudo make install).
 
Car en faisant qmake simple il utilisé Qt3.
 
Voilà. Je m'en suis rendu compte en supprimant des répertoire Qt3  et en réinstallant qwt. Et la surprise, la commande qmake simple n'était plus reconnu, et là ça m'a fait tilt. Et en essayant qmake-qt4 ça a marché.
 
alala ça fait du bien! Merci beaucoup en tout cas d'avoir pris le temps de m'aider, car sans toi j'aurais jamais trouvé et j'aurais laissé tomber.

Reply

Marsh Posté le 16-04-2008 à 17:44:35    

En plus tu l'avais marqué dans ton post précédent que tu devais utiliser qmake-qt4 :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed