web-dev-qa-db-fra.com

OpenCV références non définies pour libQt5Core.so.5

Avant de commencer, je voudrais souligner qu’il existe en réalité une très similaire (probablement exactement identique) question . Cependant, j'ai été incapable de résoudre mon problème en regardant les réponses acceptées.

J'ai suivi les instructions fournies par ce site web pour installer OpenCV3 sur Ubuntu 16.04. J'ai atteint le point où j'ai essayé de compiler un programme de test (section 6) avec g ++. La compilation retourne ceci:

/usr/bin/ld: warning: libicui18n.so.58, needed by //home/raggot/anaconda3/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicuuc.so.58, needed by //home/raggot/anaconda3/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libicudata.so.58, needed by //home/raggot/anaconda3/lib/libQt5Core.so.5, not found (try using -rpath or -rpath-link)
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `u_errorName_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_setMillis_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_getAlias_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_inDaylightTime_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `u_strToLower_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_getStandardName_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `u_strToUpper_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_setSubstChars_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_getMaxCharSize_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_getTimeZoneDisplayName_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_fromUnicode_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_open_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_getDefaultName_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_getDefaultTimeZone_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_clone_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_getDSTSavings_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucol_strcoll_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_close_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_countAvailable_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_openCountryTimeZones_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucol_open_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_compareNames_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_close_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_getAvailableName_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_openTimeZoneIDEnumeration_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_open_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucol_setAttribute_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_openTimeZones_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `uenum_close_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_countAliases_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucol_close_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucol_getSortKey_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucal_get_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `uenum_next_58'
//home/raggot/anaconda3/lib/libQt5Core.so.5: undefined reference to `ucnv_toUnicode_58'
collect2: error: ld returned 1 exit status

Tenter d’appliquer this répondre à mon problème, j’ai essayé de localiser le chemin d’installation de Qt5 sur mon système. Je l'ai fait en utilisant dpkg --listfiles libqt5core5a. J'ai ajouté le chemin résultant à LD_LIBRARY_PATH, mais cela n'a pas aidé.

J'ai essayé de réinstaller Qt5 par Sudo apt install qt5-default et j'ai également installé qttools5-dev mais cela n'a pas non plus aidé.

Mon problème pourrait avoir quelque chose à voir avec le fait que le compilateur utilise la bibliothèque d'anaconda, alors que je travaille actuellement dans un environnement global. D'autres recherches ont également montré que mon installation de Qt5 utilisant apt install a la version 5.5.1, alors que si je tape qtdiag, la version 5.6.2 apparaît. Cela pourrait être dû au fait que j'aurais peut-être également installé Qt5 sous anaconda. Donc, je pourrais avoir 2 installations. Je ne sais pas comment vérifier cela cependant.

Quelle pourrait être la cause du problème?

Modifier:

Grâce aux commentaires, j'ai réalisé que anaconda3 ne devrait même pas être dans le PATH en premier lieu. Après quelques tentatives de piratage, j'ai constaté qu'il avait été ajouté au chemin d'accès lors de la connexion dans .bashrc, probablement parce que je l'avais demandé lors de l'installation d'Anaconda. Je l'ai enlevé et essayé à make encore.

Voici ce que je vois maintenant (extrait d'une très longue sortie):

/usr/local/lib/libopencv_imgcodecs.so: undefined reference to `jpeg_stdio_dest@LIBJPEG_9.0'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QGraphicsView::staticMetaObject@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QSize::scaled(QSize const&, Qt::AspectRatioMode) const@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QWidget::update()@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QWidget::paintEngine() const@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QAbstractSlider::setMinimum(int)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QCheckBox::minimumSizeHint() const@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QFileInfo::QFileInfo(QString const&)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QWidget::hideEvent(QHideEvent*)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QObject::connectNotify(QMetaMethod const&)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `non-virtual thunk to QBoxLayout::hasHeightForWidth() const@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QWidget::isFullScreen() const@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QWidget::hasHeightForWidth() const@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QPen::QPen(QBrush const&, double, Qt::PenStyle, Qt::PenCapStyle, Qt::PenJoinStyle)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QStatusBar::showMessage(QString const&, int)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QObject::customEvent(QEvent*)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QObject::QObject(QObject*)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QFont::setLetterSpacing(QFont::SpacingType, double)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QGraphicsView::dragLeaveEvent(QDragLeaveEvent*)@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `typeinfo for QHBoxLayout@Qt_5'
/usr/local/lib/libopencv_highgui.so: undefined reference to `QGLWidget::~QGLWidget()@Qt_5'

Cela me fait penser que quelque chose me manque maintenant dans PATH.

J'ai trouvé où ces bibliothèques sont définies (dans mon installation de Qt5) dans les sous-dossiers de /usr/include/x86_64-linux-gnu/qt5/, puis les ai toutes ajoutées à PATH à l'aide de export commandes, à .profile, puis exécutées source .profile. Si je lance maintenant echo $PATH je les vois tous en place.

Malheureusement, le message d'erreur est toujours le même si j'exécute la commande make.

Éditer # 2:

Après avoir ajouté tous les sous-dossiers contenant les en-têtes de Qt5 à PATH, j’ai essayé d’ajouter une copie de PATH dans LD_LIBRARY_PATH en faisant

export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH

Encore une fois cependant, le message d'erreur n'a pas changé de nature. Je ne comprends vraiment pas pourquoi le compilateur ne voit pas les bibliothèques Qt5.

3
raggot

En bref: j'ai résolu le problème en reconstruisant OpenCV à partir de zéro. Le mérite de cette solution va à l'utilisateur Tomáš Pospíšek .

L'installation d'OpenCV s'est appuyée sur l'installation de Python3 et les packages d'Anaconda au lieu de root. Peu importe le contenu de PATHname__, PYTHONPATHou LD_LIBRARY_PATH, et quel que soit le fait que j'ai renommé le dossier anacondaen anaconda_renamed pour éviter qu'il ne soit trouvé, OpenCV a été construit pour s'appuyer sur les packages d'Anaconda. Sans surprise, à ce stade, ils n'ont pas été trouvés.

Le problème n’a pas été facile à résoudre, car même lorsque j’ai essayé de reconstruire OpenCV à partir de zéro en utilisant l’instruction d'installation standard cmake d'OpenCV, Anaconda still s'est retrouvé dans le chemin . Cependant, en utilisant cmake-gui et en recherchant anacondadans les champs, j'ai réussi à trouver où il était utilisé.

Après plusieurs tentatives pour résoudre ce problème en liant les champs de cmakeà anacondaet en voyant comment, par défaut, CMake n'arrêtait pas de trouver les paquets Anaconda ici et là, j'ai fini par supprimer Anaconda de mon système, en tirant la dernière version de opencvet de opencv-contrib en suivant à nouveau les instructions d'installation d'OpenCV.

Le processus makea généré des erreurs avec certains packages de CUDA (quelque chose comme cudaarithmet cudatestname__). Les exclure de la construction en utilisant cmake-gui a fonctionné. J'espère que je ne regretterai jamais ces exclusions.

PS: si d’autres utilisateurs malchanceux constatent également que leur commande make -j4 aboutit au processus de construction bloqué à 99% pendant des heures, essayez plutôt make -j1.

1
raggot

Un logiciel différent s'est plaint de ne pas avoir trouvé les fichiers qt et que PATH était défini sur le bon répertoire bin et que LD_LIBRARY_PATH était défini sur le bon répertoire lib. Le problème était que PATH ne pointait pas non plus vers le répertoire include de QT. J'ai ajouté le répertoire include et le répertoire include/Qt. Ensuite, j'ai exécuté configure sur opencv et make. Ensuite, mon programme a pu compiler.

0
Gamaliel