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.
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 PATH
name__, PYTHONPATH
ou LD_LIBRARY_PATH
, et quel que soit le fait que j'ai renommé le dossier anaconda
en 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 anaconda
dans 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
à anaconda
et 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 opencv
et de opencv-contrib
en suivant à nouveau les instructions d'installation d'OpenCV.
Le processus make
a généré des erreurs avec certains packages de CUDA (quelque chose comme cudaarithm
et cudatest
name__). 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
.
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.