web-dev-qa-db-ja.com

libQt5Core.so.5のOpenCV未定義参照

始める前に、実際には非常によく似た(おそらくまったく同じ) question があることを指摘したいと思います。しかし、受け入れられた答えを見ても問題を解決できませんでした。

このWebサイト の指示に従って、Ubuntu 16.04にOpenCV3をインストールしました。 g ++を使用してテストプログラム(セクション6)をコンパイルしようとしたところに到達しました。コンパイルはこれを返します:

/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

this 私の問題への回答を適用しようとして、システム上のQt5のインストールパスをローカライズしようとしました。 dpkg --listfiles libqt5core5aを使用して実行しました。結果のパスをLD_LIBRARY_PATHに追加しましたが、役に立ちませんでした。

Sudo apt install qt5-defaultでQt5を再インストールして、qttools5-devもインストールしようとしましたが、解決しませんでした。

私の問題は、コンパイラがanacondaのライブラリを使用しているという事実と関係があるかもしれませんが、私は実際にグローバル環境で作業しています。さらにいくつかの調査では、apt installを使用するQt5インストールにはバージョン5.5.1があり、qtdiagと入力するとバージョン5.6.2が表示されることがわかりました。それは、ある時点でanacondaの下にもQt5をインストールした可能性があるためです。だから、私は2つのインストールがあるかもしれません。しかし、これを確認する方法がわかりません。

問題の原因は何ですか?

編集:

コメントのおかげで、私はanaconda3がそもそもPATHにあるべきではないことに気付きました。いくつかのハッキングを行って、ログイン時に.bashrcのパスに追加されたことがわかりました。おそらく、Anacondaのインストール中にそう尋ねたからです。私はそれを削除し、makeを再試行しました。

これは私が今見ているものです(非常に長い出力の抽出):

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

これは、私がPATHの何かを見逃しているように思わせます。

これらのライブラリが/usr/include/x86_64-linux-gnu/qt5/のサブフォルダーで(Qt5のインストールで)定義されている場所を見つけ、その後、.profilePATHコマンドを使用してそれらすべてをexportに追加し、source .profileを実行します。ここでecho $PATHを実行すると、すべてが適切に表示されます。

残念ながら、makeコマンドを実行しても、エラーメッセージは同じままです。

#2を編集:

Qt5のヘッダーを含むすべてのサブフォルダーをPATHに追加した後、LD_LIBRARY_PATHPATHのコピーを追加しようとしました

export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH

ただし、エラーメッセージは本質的に変わりませんでした。コンパイラがQt5ライブラリを認識しない理由を本当に理解していません。

3
raggot

つまり、OpenCVをゼロから再構築することで問題を解決しました。このソリューションの功績は、ユーザー TomášPospíšek にあります。

OpenCVのインストールは、ルートではなくPython3インストールとAnacondaのパッケージに依存していました。 PATHPYTHONPATH、またはLD_LIBRARY_PATHの内容に関係なく、anacondaフォルダーの名前をanaconda_renamedに変更して、検出されないようにしました、OpenCV自体は、Anacondaのパッケージに依存するように構築されました。驚くことではありませんが、この時点では見つかりませんでした。

この問題は、標準のcmakeインストール手順 OpenCVを使用してOpenCVをゼロから再構築しようとしても、Anacondaはまだ パスに収まっているため) 。ただし、cmake-guiを使用し、フィールドでanacondaを検索することで、使用場所を見つけることができました。

cmakeのフィールドをanacondaからリンクし、デフォルトでCMakeがあちこちでAnacondaパッケージを見つけ続ける様子を見て、この問題をうまく解決しようと何度か試みた後、システムからAnacondaを削除して、 opencvおよびopencv-contribの最新バージョン、およびOpenCVのインストール手順にもう一度従います。

makeプロセスにより、CUDAの一部のパッケージでエラーが発生しました(cudaarithmcudatestなど)。 cmake-guiを使用してビルドから除外しました。これらの除外を決して後悔しないことを願っています。

PS:他の不運なユーザーがmake -j4コマンドの結果、構築プロセスが何時間も99%で停止することに気づいた場合は、代わりにmake -j1を試してください。

1
raggot

Qtファイルが見つからず、PATHが正しいbinディレクトリに設定され、LD_LIBRARY_PATHが正しいlibディレクトリに設定されているという苦情がありました。問題は、PATHがQTのインクルードディレクトリも指していないことでした。 includeディレクトリとinclude/Qtディレクトリの両方を追加しました。それからopencvとmakeでconfigureを実行しました。その後、私のプログラムはコンパイルできました。

0
Gamaliel