3

MinGW と CMake を使用して、OpenCV 2.4.1 をエラーなしで静的にコンパイルしました。私がチェックしましたWith_QT

チェックを外してandBUILD_SHARED_LIBSに進みます 。mingw32-makemingw32-make install

エラーなしでビルドされ、最終的に.aopencvのlibフォルダーにたくさんのファイルがあります。

しかしLIBS and INCLUDEPATH、.pro ファイルのパラメーターを設定し、Qt で単純なアプリケーションを実行した後、エラーが発生しました。

.proまた、次の行をファイルに追加します。

CONFIG += -static -static-libgcc

私は最後の行のエラーを提供しました:

F:\OpenCV2.4.1\opencv-static\install\lib\libopencv_highgui241.a(grfmt_jpeg2000.cpp.obj):grfmt_jpeg2000.cpp:(.text$_ZN2cv13Jpeg2KDecoder10readHeaderEv+0x4f):
undefined reference to `jas_image_decode'  collect2: ld returned 1
exit status  mingw32-make[1]: ***

[release\test.exe] Error 1 
mingw32-make: *** [release] Error 2  The process "C:/ming44/bin/mingw32-make.exe" exited with code %2. Error while building project test (target: Desktop) When executing build step 'Make'

アップデート

highgui.hppメソッドを呼び出したときだけエラーが発生することがわかりました。を使用すると、次のエラーが発生しますcv::imshow()

F:\OpenCV2.4.1\opencv-static2\install\lib\libopencv_highgui241.a(window_w32.cpp.obj):window_w32.cpp:(.text$_ZL17icvCreateTrackbarPKcS0_PiiPFviEPFviPvES4_+0x5e1): undefined reference to `CreateToolbarEx@52'  collect2: ld returned 1
exit status  mingw32-make[1]: *** [release\test.exe] Error 1 
mingw32-make: *** [release] Error 2

誰でもこの問題を解決するのを手伝ってくれますか?

ありがとう

4

1 に答える 1

2

修正プロセスを進めていく中で多くの質問がありましたので、ここでそれらすべてに対する回答をまとめてみます。

未解決のシンボル


undefined reference to `jas_image_decode'

jas_image_decodeシンボルはlibjasper (OpenCV のサードパーティ依存関係) で定義されています。それを解決するには、 に対してリンクしlibjasper.aます。

undefined reference to `CreateToolbarEx@52'

シンボルは Windows APIのCreateToolbarEx一部であるため、システム ライブラリで定義されます (この場合は常にツールチェーン (MinGW) で提供されます)。このようなシンボルを解決するためにリンクする必要があるライブラリは、 MSDNを参照していつでも見つけることができます(下にスクロールして、ライブラリDLLのセルを参照してください)。この場合、 を見ることができますがComctl32.lib、MSDN はもちろん、Microsoft Visual C ツールチェーンが定義する形式でライブラリの名前を投稿します。MinGW ツールチェーンを使用しているため、この名前を (精神的に) ライブラリの Unix 命名規則に変換する必要があります。この場合はlibcomctl32.a.

undefined reference to `AVIStreamRelease@4'

前のケースと同様に、ここで見つけて、リンクする必要があると推測しlibvfw32.aます。

注:このようなシステム ライブラリ (Windows API を含む) へのパスは、常にツールチェーンによって自動的に検索されます。したがって、-Lコンパイル/リンケージ中にオプションを指定するのではなく、ライブラリ自体のみを指定する必要があります-lcomctl32

undefined reference to `cv::dft'

まあ、これもOpenCVのコンポーネントです(cv名前空間は明らかにそれを示唆しています)。少し検索すると、 Core コンポーネントで定義されていることがわかります。したがって、そのシンボルを解決するには、 に対してリンクしlibopencv_core.aます。

アプローチ


不足しているシンボルを解決するためにリンクするライブラリを見つけるにはどうすればよいですか?

ここには経験則や直接的なレシピはありませんが、主に経験から得られるいくつかのトリックと経験に基づいた推測があります。以下にいくつかの例を示します。

  1. たとえば の場合、CreateToolbarEx関数名の Windows API 命名規則を認識していれば、Windows API に属していると簡単に推測できました。したがって、私が次に行うことはCreateToolbarEx、Google に入力し、MSDN の対応するページにジャンプし、下にスクロールして、ライブラリ名が何であるかを確認し、ライブラリの Unix 命名規則 (上記を参照) に (精神的に) 変換することです。

  2. OpenCV の場合はもっとトリッキーです。OpenCV はサード パーティのライブラリであり、特定のシンボルが定義されているライブラリを見つけるのが難しいかどうかは、提供されるドキュメントの質にかかっています。OpenCV のドキュメントは非常に優れていることがわかりますが、すべてのシンボルについてこれらの重要なヒントがまだ欠落しており、残念です。しかし、私たち (開発者) は、サード パーティのライブラリのドキュメントがどれほどくだらないものであっても、そのような問題に対処し、仕事を成し遂げることができなければなりません。

    そのため、次のようなファイル コンテンツ検索ユーティリティを使用することをお勧めします(Unix OS ファミリで一般的ですが、 MSYSgrepディストリビューションでは Windows でも利用できます)。このようにして、たとえば の場合、 OpenCV ソース ツリーのルートで実行し、そのシンボルが定義されている場所をすぐに追跡できます。その後、含まれているファイルがどのコンポーネントに属しているかを推測する必要がありますが、それは簡単なはずです。周りを見回して、ファイルが存在するディレクトリを確認するだけです。cv::dftgrep -r "void.*dft(" .cv::dft

結論


人生で OpenCV を使用したことがないことを誓いますが、ご覧のとおり、不足しているシンボルをすべて見つけることができました。その結果、未解決のシンボルを検索する提案された手法は、ある程度信頼できると結論付けることができます。

最後に、これは OpenCV または Qt に固有のものではありません。ここでは、基本的なプログラマーの職人技を扱っています。このような日常業務を迅速に解決できる生産的なソフトウェア開発者になりたい場合は、grep間違いなくツールの武器庫の一部になる必要がある多くの重要なユーティリティの 1 つにすぎません。

于 2013-04-25T00:18:33.773 に答える