OpenCV referências indefinidas para libQt5Core.so.5

3

Antes de começar, gostaria de salientar que, na verdade, existe uma pergunta (semelhante, provavelmente idêntica) . No entanto, não consegui resolver meu problema olhando para as respostas aceitas.

Eu segui as instruções fornecidas por este site para instalar o OpenCV3 no Ubuntu 16.04. Cheguei ao ponto em que tentei compilar um programa de teste (seção 6) com g ++. A compilação retorna isso:

/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

Tentando aplicar esta resposta ao meu problema, tentei localizar o caminho de instalação do Qt5 no meu sistema. Eu fiz isso usando dpkg --listfiles libqt5core5a . Eu adicionei o caminho resultante a LD_LIBRARY_PATH , mas isso não ajudou.

Eu tentei reinstalar o Qt5 por sudo apt install qt5-default e também instalei qttools5-dev , mas também não ajudou.

Meu problema pode ter algo a ver com o fato do compilador estar usando a biblioteca do anaconda, enquanto eu estou realmente trabalhando no ambiente global. Mais algumas pesquisas mostraram também que minha instalação do Qt5 usando apt install tem a versão 5.5.1, enquanto que se eu digitar qtdiag , eu vejo a versão 5.6.2 aparecer. Isso pode ser porque em algum momento eu poderia ter instalado o Qt5 no anaconda também. Então, eu posso ter duas instalações. Eu não sei como verificar isso.

Qual poderia ser a causa do problema?

Editar:

Graças aos comentários, percebi que anaconda3 nem deveria estar no PATH em primeiro lugar. Com algum hacking por aí, descobri que ele foi adicionado ao caminho no login em .bashrc , provavelmente porque eu pedi isso durante a instalação do Anaconda. Eu removi e tentei make novamente.

Isto é o que vejo agora (extrair uma saída muito longa):

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

Isso me faz pensar que agora sinto falta de algo no PATH .

Descobri onde essas bibliotecas estão definidas (na minha instalação do Qt5) nas subpastas de /usr/include/x86_64-linux-gnu/qt5/ e, posteriormente, adicionei todas elas a PATH por meio dos comandos export em .profile e, em seguida, executamos %código%. Se eu executar agora source .profile , vejo todos eles no lugar.

Infelizmente, a mensagem de erro ainda é a mesma se eu executar o comando echo $PATH .

Editar # 2:

Depois de adicionar todas as subpastas contendo os cabeçalhos de Qt5 a make , tentei adicionar uma cópia de PATH em PATH fazendo

export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH

Mais uma vez, no entanto, a mensagem de erro não mudou na natureza. Eu realmente não entendo porque o compilador não vê as bibliotecas do Qt5.

    
por raggot 03.03.2018 / 21:39

1 resposta

1

Resumindo: resolvi o problema reconstruindo o OpenCV a partir do zero. O crédito desta solução vai para o usuário Tomáš Pospíšek .

A instalação do OpenCV contou com a instalação do Python3 e pacotes do Anaconda ao invés do root. Não importa o conteúdo de PATH , PYTHONPATH ou LD_LIBRARY_PATH , e independentemente do fato de eu ter renomeado a pasta anaconda para anaconda_renamed para evitar que ela seja encontrada, o próprio OpenCV foi criado para confiar nos pacotes da Anaconda . Não surpreendentemente, neste momento eles não foram encontrados.

O problema não foi fácil de corrigir, pois mesmo quando tentei reconstruir o OpenCV a partir do zero usando o padrão cmake instrução de instalação da OpenCV, o Anaconda ainda acabou o caminho . No entanto, usando cmake-gui e pesquisando anaconda nos campos, consegui encontrar onde ele foi usado.

Depois de várias tentativas de solucionar esse problema, vinculando os campos de cmake de anaconda e vendo como o CMake padrão encontrava pacotes do Anaconda aqui e ali, acabei excluindo o Anaconda do meu sistema, puxando o versão mais recente de opencv e opencv-contrib e seguindo as instruções de instalação do OpenCV mais uma vez.

O processo make resultou em alguns erros com alguns pacotes de CUDA (algo como cudaarithm e cudatest ). Excluindo-os da construção usando cmake-gui trabalhado. Espero nunca me arrepender dessas exclusões.

PS: se outros usuários infelizes também descobrirem que o comando make -j4 resulta no processo de construção ficando preso em 99% por horas, tente make -j1 .

    
por raggot 16.04.2018 / 10:36