Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2978 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Courbes avec Qwt (erreur de segmentation)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Courbes avec Qwt (erreur de segmentation)

n°1714720
benito5965​0
Posté le 09-04-2008 à 00:19:04  profilanswer
 

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.

mood
Publicité
Posté le 09-04-2008 à 00:19:04  profilanswer
 

n°1714723
benito5965​0
Posté le 09-04-2008 à 00:49:49  profilanswer
 

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.

n°1714725
bjone
Insert booze to continue
Posté le 09-04-2008 à 01:10:24  profilanswer
 

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

n°1714727
benito5965​0
Posté le 09-04-2008 à 01:16:58  profilanswer
 

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à .

n°1714728
IrmatDen
Posté le 09-04-2008 à 01:21:59  profilanswer
 

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 ;)

n°1714730
benito5965​0
Posté le 09-04-2008 à 01:58:22  profilanswer
 

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

n°1714731
benito5965​0
Posté le 09-04-2008 à 02:05:57  profilanswer
 

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).

n°1715045
IrmatDen
Posté le 09-04-2008 à 14:57:57  profilanswer
 

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
n°1715269
benito5965​0
Posté le 09-04-2008 à 19:32:36  profilanswer
 

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?

n°1715284
benito5965​0
Posté le 09-04-2008 à 19:50:50  profilanswer
 

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...

mood
Publicité
Posté le 09-04-2008 à 19:50:50  profilanswer
 

n°1715351
IrmatDen
Posté le 09-04-2008 à 22:38:16  profilanswer
 

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.

n°1716573
benito5965​0
Posté le 12-04-2008 à 00:06:22  profilanswer
 

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

n°1716602
_darkalt3_
Proctopathe
Posté le 12-04-2008 à 08:37:43  profilanswer
 

+1 pour gdb


---------------
Töp of the plöp
n°1716754
benito5965​0
Posté le 12-04-2008 à 16:00:28  profilanswer
 

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?

n°1716770
IrmatDen
Posté le 12-04-2008 à 17:16:45  profilanswer
 

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

n°1716786
benito5965​0
Posté le 12-04-2008 à 17:56:44  profilanswer
 

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

n°1716796
IrmatDen
Posté le 12-04-2008 à 18:40:09  profilanswer
 

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

n°1716808
benito5965​0
Posté le 12-04-2008 à 19:05:06  profilanswer
 

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---

n°1716809
benito5965​0
Posté le 12-04-2008 à 19:11:31  profilanswer
 

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?)

n°1716816
benito5965​0
Posté le 12-04-2008 à 19:34:49  profilanswer
 

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)

n°1716880
IrmatDen
Posté le 13-04-2008 à 01:56:28  profilanswer
 

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
n°1716906
benito5965​0
Posté le 13-04-2008 à 10:49:46  profilanswer
 

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?

n°1716941
IrmatDen
Posté le 13-04-2008 à 13:43:12  profilanswer
 

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...

n°1718698
benito5965​0
Posté le 16-04-2008 à 17:26:37  profilanswer
 

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.

n°1718716
IrmatDen
Posté le 16-04-2008 à 17:44:35  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Courbes avec Qwt (erreur de segmentation)

 

Sujets relatifs
erreur de link avec le passage a visual 2008VBA ACCESS erreur 3202
erreur SMTPratrapper une erreur de scanf
erreur function: imap_open()Gestion d' "erreur" avec trigger_error() - bien/pas bien ?
[C#] Erreur déploiement suite changement de version VS[dumb girl asking] fermer des onglets et détruire des choses
erreur $_POST['URL']batch, commande ping et rapport d'erreur
Plus de sujets relatifs à : Courbes avec Qwt (erreur de segmentation)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR