web-dev-qa-db-ja.com

opencvで動的ライブラリの代わりに静的ライブラリを使用する

Visual Studio 2012には、opencvダイナミックライブラリを使用するプロジェクトがあります。コンパイル、リンク、および正常に機能しました。

プロジェクトを変更して、動的ライブラリの代わりに静的ライブラリを使用するようにします。

プロジェクトVC++ディレクトリのライブラリディレクトリを

  C:\thirdparty\opencv\build\x86\vc11\lib

宛先:C:\ thirdparty\opencv\build\x86\vc11\staticlib

しかし、プロジェクトをビルドするときに、次のようなリンカエラーが大量に発生します。

 Error  110 error LNK2001: unresolved external symbol _TIFFWriteScanline    myproject\opencv_highgui245.lib(grfmt_tiff.obj) 

さらに重要なことは、次のような多くのエラーです。

 Error  1   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in myproject.obj    myproject\opencv_core245.lib(system.obj)    

動的ライブラリを使用するプロジェクトを静的ライブラリを使用するように変換するには、他にどのような変更が必要ですか?

編集1

/ mdを/ mtに変更し、いくつかの新しいライブラリを入力ライブラリのリストに追加した後:

opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib

いくつかの新しいエラーが発生しています:

Error   9   error LNK2001: unresolved external symbol _AVIFileCreateStreamA@12  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   8   error LNK2001: unresolved external symbol _AVIFileGetStream@16  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   5   error LNK2001: unresolved external symbol _AVIFileInit@0    myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   7   error LNK2001: unresolved external symbol _AVIFileOpenA@16  myproject\opencv_highgui245.lib(cap_vfw.obj)    

どうやらいくつかのライブラリが欠落していますが、どれですか?

編集2リストにライブラリを追加する必要があります。ライブラリの完全なリストは次のとおりです。

opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib
Vfw32.Lib
comctl32.lib

これで問題は解決しました。

19
mans

プロジェクトのランタイムライブラリを/ MTdに変更することで、VS 2013で静的ライブラリを動作させることができます。

enter image description here

次に、これらのリンカー>>入力>>追加の依存関係を含めます。

opencv_core248d.lib
opencv_imgproc248d.lib
opencv_highgui248d.lib
opencv_ml248d.lib
opencv_video248d.lib
opencv_features2d248d.lib
opencv_calib3d248d.lib
opencv_objdetect248d.lib
opencv_contrib248d.lib
opencv_legacy248d.lib
opencv_flann248d.lib
libpngd.lib
libtiffd.lib
zlibd.lib
IlmImfd.lib
libjasperd.lib
libjpegd.lib
comctl32.lib
gdi32.lib
vfw32.lib
11
Jason Kleban

CMakeを使用してビルドする場合、OpenCV CMakeオプションの1つであるため、非常に簡単です。 BUILD_WITH_STATIC_CRTをオフに設定するだけです。例えば。 CMakeコマンドラインで

-DBUILD_WITH_STATIC_CRT=OFF
7
G Huxley

OpenCV 3.0.0を使用するVisual Studio 2012の場合、これらの問題は依然として当てはまり、このスレッドのソリューションは関連しています。動作させるためのセットアップは次のとおりです。

Windowsのシステム環境変数

Windowsのシステム環境変数で設定:_OPENCV_DIR = D:\OpenCV\build\x64\v11_(_D:\OpenCV\_をopencvへのパスに置き換えます。また、64ビットマシンの場合はx64、32ビットマシンの場合はx86)。

AdditionalLibraryDirectoriesにstaticlibを使用します

追加のライブラリディレクトリ([表示]> [プロパティページ]> [構成プロパティ]> [リンカ]> [全般]> [追加のライブラリディレクトリ])を次のように設定します:$(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

ランタイムライブラリ

[コード生成]> [ランタイムライブラリ]をMulti-threaded Debug (/MTd) per osɐſ's answer に変更します。そうしないと、この種のエラーが発生します。

_Error   1   error LNK2038: mismatch detected for 'RuntimeLibrary': value
'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in Source.obj
C:\Users\...\documents\visual studio 2012\Projects\OpenCVTest2\OpenCVTest2\opencv_core300d.lib(alloc.obj)   OpenCVTest2
_

最後に、追加の依存関係リスト

追加の依存関係には、staticlibディレクトリ内のすべてのライブラリ名を含める必要があります。 バージョン番号を確認する; OpenCV 3.0.0を使用しているため、ファイル名は* 300d.libで終わります。 _comctl32.lib_および_vfw32.lib_はstaticlibにはないが、念のため追加しました([表示]> [プロパティページ]> [構成プロパティ]> [リンカ]> [入力]> [追加の依存関係])。

_opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_hal300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videostab300d.lib
libtiffd.lib
libpngd.lib
libjpegd.lib
libjasperd.lib
IlmImfd.lib
libwebpd.lib
ippicvmt.lib
zlibd.lib
comctl32.lib
vfw32.lib
_

x86対x64

また、VS2012は、ターゲットマシンが this guy のようなモジュールマシンタイプと一致しないと主張しているという問題に遭遇しました。解は here で与えられます。

4
mathiass

おい、教えてくれ...そこに行ったことがある..静的libを試した(数回..)それは悪だ。

  1. Visual Studioを使用している場合は、VS2010に戻す方が適切です。 VS2012以降は、これらのライブラリのビルドには使用されませんでした。そして、それは少なくともバージョン244には当てはまります。リンクすることはできるかもしれませんが、非常に基本的な機能でクラッシュします。
  2. GCCを使用している場合、.aライブラリが実際に悪であることに気付くかもしれません。それらはLINUX用のウィンドウでクロスコンパイルされました。 cygwinとリンクしようとすると、MinGwはその仕事をしません。

2日間試した後、無駄な時間が十分であると判断し、VS2010を使用すれば正常に機能するDLLに戻りました。

ターンオフにならないようにしましょう。リンクを作成できた場合は、方法を教えてください:)

3
user1241378

静的リンクを使用してOpenCV 2.4.9に依存するアプリケーションを作成しました。

1)リンカーに追加の依存関係を追加しました。

opencv_core249d.lib opencv_imgproc249d.lib opencv_highgui249d.lib opencv_ml249d.lib opencv_video249d.lib opencv_features2d249d.lib opencv_calib3d249d.lib opencv_objdetect249d.lib opencv_contrib249d.lib opencv_legacy249d.lib opencv_flann249d.lib libpngd.lib libtiffd.lib zlibd.lib IlmImfd.lib libjasperd.lib libjpegd。 lib comctl32.lib gdi32.lib vfw32.lib

2)リンカー=>一般=>追加のライブラリディレクトリ=> $(OPENCV_DIR)\ x86\vc12\libを$(OPENCV_DIR)\ x86\vc12\staticlibに変更しました。OPENCV_DIRは、C:\ OpenCV 2.4.9に設定された環境変数です。\opencv\build

3)C/C++ =>コード生成=>マルチスレッドデバッグDLL(MD)からマルチスレッドデバッグ(MTd)に変更)

成功したビルドを楽しんだ。

同じことがリリースモードでも機能します(もちろん、非デバッグライブラリに対するリンク)

1
dajuric