Courbes avec Qwt (erreur de segmentation) - C++ - Programmation
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.
Marsh Posté le 09-04-2008 à 01:10:24
ReplyMarsh 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à .
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
benito59650 a écrit : Et en fait je pense que la ligne qui pose problème c'est celle-ci : |
benito59650 a écrit : Cependant si je fais le même fichier.pro juste avec cette ligne en moins j'ai l'erreur suivante :
|
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
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
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).
Marsh Posté le 09-04-2008 à 14:57:57
Ah, j'avais pas reconnu
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 :
|
(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 :
|
4. on teste une première fois la compil+exécution des exemples (on est toujours dans ton répertoire qwt):
Code :
|
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 :
|
6. Même chose pour les lib:
Code :
|
7. Le projet tel qu'il doit être:
Code :
|
Code :
|
8. on compile:
Code :
|
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.
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?
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...
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.
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
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?
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
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?
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)?
Marsh Posté le 12-04-2008 à 19:05:06
Ah d'accord c'est plus clair :-)
Voilà
Code :
|
Marsh Posté le 12-04-2008 à 19:11:31
désolé j'ai oublié des lignes
Code :
|
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)
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"
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?
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...
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.
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
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
Pouvez-vous m'aider s'il vous plait.