Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Passage de VS à Qt : mes problèmes

Bonjour tout le monde ! =)

Alors comme je le disais dans ma présentation, je viens de passer de Visual Studio + opencv à Qt + opencv, et c'est là que ça se complique.

Sous visual je compilais avec le compilateur de visual, mais sous Qt maintenant je dois compiler avec mingw, sinon ça ne fonctionne pas. Bref.

Mon problème du jour est un "undefined reference" lors de la compilation, alors que j'ai mis tous les include qu'il faut. J'ai essayé de changer quelques petites choses mais sans succès, je désespère :D

L'erreur est dans mon mainwindow.cpp que voici :

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "themain.h"
#include "traitementvideo.h"

//**include pour opencv
#include "opencv2/opencv.hpp"
#include "opencv/cv.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

tmain = new TheMain();
connect(tmain, SIGNAL(MyMain(int)), this, SLOT(onMyMain(int)));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::onMyMain(const char fichier[100])
{
/*exemple pour voir si ça fonctionne bien, on incrémente uniquement le lcdnumber
ui->lcdNumber->display(num);*/

//**Ouverture de la video
traitementVideo tvideo;
VideoCapture avi;
avi = tvideo.ouvertureFichierVideo(fichier); //undefined reference to `traitementVideo::ouvertureFichierVideo(char const*)'
}

void MainWindow::on_pushButton_2_clicked()
{
tmain->start();
}


void MainWindow::on_pushButton_3_clicked()
{
tmain->Stop = true;
}

la fonction du undefined reference est définie dans ma classe traitementVideo :

voilà le .h :

#ifndef TRAITEMENTVIDEO_H
#define TRAITEMENTVIDEO_H

//**include pour opencv
#include "opencv2/opencv.hpp"
#include "opencv/cv.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

class traitementVideo
{
public:
traitementVideo();

///Ouverture d'une vidéo depuis un fichier
VideoCapture ouvertureFichierVideo(const char fichier[100]);
};

#endif // TRAITEMENTVIDEO_H
et le .cpp

#include "traitementvideo.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "themain.h"

//**include pour opencv
#include "opencv2/opencv.hpp"
#include "opencv/cv.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

traitementVideo::traitementVideo()
{
}

/**
* \param fichier : le nom du fichier video que l'on souhaite ouvrir
* \return Une VideoCapture stockant la video prete a etre traitee
* \details Les videos generalement ouvertes par cette methode sont au format avi
**/
cv::VideoCapture ouvertureFichierVideo(const char fichier[100])
{
printf("Ouverture video depuis le fichier...\n");
VideoCapture avi = VideoCapture(fichier);
return avi;
}

Est-ce que vous savez d'où vient ce undefined reference ?

Merci d'avance ^^

Réponses

  • Re,
    Le mieux est de faire un fichier .pro pour ton projet.
    Tu peux rester sous visual studio + Qt, si tu as l'habitude de msvc.
    Pour ton undefined, c'est juste que tu ne links pas sur la lib openCV.
    Je te dis que tu peux rester sous msvc car tu n'auras pas à recompiler openCV.
    Si tu veux basculer sur mingw, faut la recompiler.
    Dans le .pro, tu dois renseigner LIBS de cette manière :

    LIBS += -Lchemin_vers_la_lib_opencv -lnom_de_la_lib
    et pour que tes includes soient plus simple tu rajoutes aussi

    INCLUDEPATH += /path/vers/include/opencv
    En gros c'est ça ;)
  • Re =)

    Arf désolée j'ai oubliée de le mettre mais j'ai un fichier .pro déjà, qui est comme ceci :

    #-------------------------------------------------
    #
    # Project created by QtCreator 2013-05-13T15:06:26
    #
    #-------------------------------------------------

    QT += core gui
    QT += widgets

    TARGET = MinTry
    TEMPLATE = app


    SOURCES += main.cpp\
    mainwindow.cpp \
    themain.cpp \
    traitementvideo.cpp

    HEADERS += mainwindow.h \
    themain.h \
    traitementvideo.h

    FORMS += mainwindow.ui

    LIBS += -LG:/Anthias/OpenCV2.4.1/build/x86/mingw/lib -llibopencv_core241 -llibopencv_highgui241 -llibopencv_imgproc241 -llibopencv_video241


    INCLUDEPATH += "G:/Anthias/OpenCV2.4.1/build/include/"

    Comme tu peux le voir, tout y figure, a priori xD
    Il reconnait bien tout ce qui est en rapport avec OpenCV, sinon il me dirait "dafuq c'est quoi ça une VideoCapture ?" xD
  • Quel est exactement le message d'erreur complet, pour voir sur quoi le undefined fait référence.
  • C'est : "undefined reference to `traitementVideo::ouvertureFichierVideo(char const*)' "
    dans le fichier mainwindow.cpp ligne 39 =)
  • Désolée du double poste (je ne sais pas si c'est permis ici mais j'avais peur qu'en éditant on ne voit pas ma question xD)

    Je viens de me rendre compte que je n'ai pas de fichier moc_traitementvideo dans mon dossier de debug, est-ce normal ?
    Alors qu'il y en a pour mainwindow et mon autre classe nommée "themain" :o
  • C'est normal car traitementvideo n'hérite pas de QObject et n'a donc pas de signal/slot
    Pour le undefined, je cherche toujours, mais pour le moment je sèche.
  • Ah d'accord, je m'en doutais un peu mais je préférais en être sûre ^^

    Arf, je pose une colle là alors, ça me rassure dans un sens, je ne suis pas complètement noob :D 8)
  • May 2013 modifié
    Alors alors, je viens de rajouter un peu de code pour voir si le problème est juste avec cette méthode ou si ça se répète avec d'autres, et j'ai exactement la même erreur avec la deuxième méthode.

    Oubli de ma part qui peut aider, après cette ("ces" maintenant) erreur de undefined reference, j'ai l'erreur suivante :
    " collect2 : Id returned 1 exit status " , qui si j'en crois le web veut dire "allo ? elle est où la définition de ta méthode ? je ne la trouve pas !", et en effet, si je clique droit sur le nom de la fonction dans le .h (déclaration), et que je clique sur "changer entre la définition et déclaration de la méthode", Qt ne fait rien, il ne sait donc pas où se trouve la définition :o

    Du coup, j'ai bidouillé un peu le .cpp : j'ai supprimé les commentaires doxygen pour voir si c'est ce qui le perturbait mais non,
    et là, d'un seul coup, illumination, j'ai tout simplement oublié de mettre "traitementVideo::" devant chaque déclaration de méthode ! :D
    Et oui, le copier-coller entre Visual Studio et Qt, c'est mal ]:D
    Ces méthodes ne sont pas issues d'une réelle classe sous Visual, ce sont juste des méthodes comme ça, il n'y a pas de "this" si je peux dire, alors que dans Qt si, ce que je n'avais pas compris jusqu'ici xD

    Du coup voilà, ce problème est résolu :D

    Mais je laisse le sujet ouvert pour l'instant car je ne suis pas à l'abris de faire d'autres bourdes du genre héhé O:)

    Merci à toi en tous cas babaOroms ;)
  • Plop !

    Oui c'est encore moi =)

    Maintenant que ça compile, ça ne veut pas s'exécuter :mad:

    ça me met "blablabla s'est terminé avec le code -1073741511"

    Alors, hier encore, c'était le code 1073741515, j'ai fait mes recherches, j'ai vu que c'était un problème de dll, j'ai téléchargé dependency walker et j'ai rajouté dans le dossier qui va bien les dll qui lui manquaient. Ensuite, le code de l'erreur a changé. Et si j'essaye d'executer mon fichier .exe de mon programme, il me met "le point d'entrée de procédure blablabla est introuvable dans la bibliothèque de liaisons dynamique libstdc++-6.dll" alors que cette dll est bien dans le dossier, je l'ai copié collé à partir du dossier QTSDK\mingw\bin, il n'y a aucun autre fichier de ce type dans un autre dossier quelconque donc normalement je ne me suis pas trompée. Avec mes recherches, je me suis dit, il est peut être obsolète ce fichier ou je ne sais quoi, je vais désinstaller et réinstaller Qt, mais non, toujours la même erreur même après avoir récupérer le nouveau dll.

    Du coup, je sèche. J'ai la même erreur en Debug et en Release. Dependency walker m'indique qu'il y a bien un erreur avec cette dll mais je ne sais pas laquelle. :(

    Donc voilà, si quelqu'un a une idée O:)
  • Pour le moment pas trop d'idée. Mais si tu enlèves toutes les dll que tu as mis dans le répertoire de ton exe et que tu lances ton exe à partir de QtCreator, as-tu la même erreur ?
  • Si je les retire, je retrouve l'erreur "blablabla s'est arrêté avec le code -1073741515" que j'avais avant de les rajouter (normal :D ) xD
  • Pourquoi inclu tu toujours "highgui" de opencv si tu utilises Qt ?
    Opencv pour le traitement et Qt pour l'affichage non ?

    Ensuite est-ce que les dll opencv que tu utilises sont compilées avec le même compilo que ton soft (j'ai cru lire que tu étais passé de MSVC à mingw)
    as-tu bien également recompilé opencv ?
  • Alors pour highgui c'est parce que je vais tout reprendre comme j'ai fait avec opencv, et ensuite je verrai ce que je dois changer, donc peut-être que j'en n'aurai plus besoin par la suite =)

    Alors, en fait je ne suis pas sûre d'avoir fait ça correctement, j'ai bien vu qu'il fallait que je recompile opencv avec mingw, donc j'ai cherché des tutos, un peu vagues d'ailleurs, mais bref. J'ai téléchargé code::blocks, j'ai commencé le tuto, puis je me suis rendu compte que j'avais déjà un dossier "OpenCV2.4.1/build/x86/mingw/lib" avec toutes les lib dont j'avais besoin, donc je n'ai pas poursuivi le tuto, et là je crois que je me suis embrouillée total xD

    Du coup, je viens de reprendre mon tuto, code::block, nouveau projet blablabla, et au moment où j'ai fait tout ce qui est dit, je compile, run, et bim on me parle de dll qui n'est pas trouvé gnagnagna, je copie colle la dll, et hop "point d'entrée de procédure bidule est introuvable dans la bibliothèque de liaisons dynamique libstdc++-6.dll". Mais bon, est-ce que le simple fait de compiler est suffisant ?! ou est-ce que je dois absolument faire en sorte que le projet exemple que j'ai pris fonctionne ?

    Je suis paumée ça y est parce que j'ai l'impression que ça n'a rien changé xD

    Eclairez moi svp :D
Connectez-vous ou Inscrivez-vous pour répondre.