始める前に、実際には非常によく似た(おそらくまったく同じ) 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のインストールで)定義されている場所を見つけ、その後、.profile
のPATH
コマンドを使用してそれらすべてをexport
に追加し、source .profile
を実行します。ここでecho $PATH
を実行すると、すべてが適切に表示されます。
残念ながら、make
コマンドを実行しても、エラーメッセージは同じままです。
#2を編集:
Qt5のヘッダーを含むすべてのサブフォルダーをPATH
に追加した後、LD_LIBRARY_PATH
にPATH
のコピーを追加しようとしました
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH
ただし、エラーメッセージは本質的に変わりませんでした。コンパイラがQt5ライブラリを認識しない理由を本当に理解していません。
つまり、OpenCVをゼロから再構築することで問題を解決しました。このソリューションの功績は、ユーザー TomášPospíšek にあります。
OpenCVのインストールは、ルートではなくPython3インストールとAnacondaのパッケージに依存していました。 PATH
、PYTHONPATH
、または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の一部のパッケージでエラーが発生しました(cudaarithm
やcudatest
など)。 cmake-gui
を使用してビルドから除外しました。これらの除外を決して後悔しないことを願っています。
PS:他の不運なユーザーがmake -j4
コマンドの結果、構築プロセスが何時間も99%で停止することに気づいた場合は、代わりにmake -j1
を試してください。
Qtファイルが見つからず、PATHが正しいbinディレクトリに設定され、LD_LIBRARY_PATHが正しいlibディレクトリに設定されているという苦情がありました。問題は、PATHがQTのインクルードディレクトリも指していないことでした。 includeディレクトリとinclude/Qtディレクトリの両方を追加しました。それからopencvとmakeでconfigureを実行しました。その後、私のプログラムはコンパイルできました。