web-dev-qa-db-fra.com

utiliser des bibliothèques statiques au lieu de bibliothèques dynamiques dans opencv

J'ai un projet dans Visual Studio 2012 qui utilise des bibliothèques dynamiques opencv. Il a compilé, lié et bien fonctionné.

Je souhaite modifier le projet afin qu'il utilise des bibliothèques statiques au lieu de bibliothèques dynamiques.

J'ai changé les répertoires de la bibliothèque dans le répertoire du projet VC++ de

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

à: C:\thirdparty\opencv\build\x86\vc11\staticlib

mais quand je veux construire le projet, je reçois beaucoup d'erreurs de l'éditeur de liens telles que:

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

et surtout beaucoup d'erreurs comme celle-ci:

 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)    

Quelles autres modifications dois-je faire pour convertir un projet qui utilise des bibliothèques dynamiques pour utiliser des bibliothèques statiques?

Modifier 1

Après avoir changé/md en/mt et ajouté de nouvelles bibliothèques à la liste des bibliothèques d'entrée:

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

Je reçois de nouvelles erreurs:

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)    

Apparemment, une bibliothèque manque, mais laquelle?

Edit 2 besoin d'ajouter plus de bibliothèque à la liste. La liste complète de la bibliothèque est la suivante:

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

Cela a résolu le problème.

19
mans

Je peux faire fonctionner les bibliothèques statiques dans VS 2013 en changeant la bibliothèque d'exécution du projet en/MTd

enter image description here

puis en incluant ces Linker >> Input >> Dépendances supplémentaires:

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

Si vous construisez à l'aide de CMake, c'est très simple car c'est l'une des options OpenCV CMake; il suffit de désactiver BUILD_WITH_STATIC_CRT. Par exemple. sur la ligne de commande CMake

-DBUILD_WITH_STATIC_CRT=OFF
7
G Huxley

Pour Visual Studio 2012 avec OpenCV 3.0.0, ces problèmes s'appliquent toujours et les solutions de ce fil sont pertinentes. Voici ma configuration pour le faire fonctionner:

Variables d'environnement système de Windows

Défini dans les variables d'environnement système de Windows: OPENCV_DIR = D:\OpenCV\build\x64\v11 (Remplacez D:\OpenCV\ Par le chemin d'accès à opencv. Aussi, x64 pour les machines 64 bits, x86 pour les machines 32 bits).

Utiliser staticlib pour AdditionalLibraryDirectories

Définissez les répertoires de bibliothèque supplémentaires (Affichage> Pages de propriétés> Propriétés de configuration> Éditeur de liens> Général> Répertoires de bibliothèque supplémentaires) sur: $(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

Bibliothèque d'exécution

Modifiez la génération de code> bibliothèque d'exécution en Multi-threaded Debug (/MTd) par réponse de uosɐſ , sinon vous obtiendrez ce genre d'erreur:

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

Enfin, la liste des dépendances supplémentaires

Mes dépendances supplémentaires doivent inclure tous les noms de bibliothèque dans le répertoire staticlib. Attention aux numéros de version ; puisque j'utilise OpenCV 3.0.0, les noms de fichiers se terminent par * 300d.lib. Je crois que comctl32.lib Et vfw32.lib Ne sont pas dans la bibliothèque statique, mais je les ai ajoutés juste au cas où (Affichage> Pages de propriétés> Propriétés de configuration> Linker> Entrée> Dépendances supplémentaires):

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 vs x64

J'ai également rencontré ce problème selon lequel VS2012 prétend que la machine cible ne correspond pas au type de machine du module comme ce gars . La solution est donnée ici .

4
mathiass

Mec, permettez-moi de vous dire ... été là fait cela .. J'ai essayé la chose lib statique (quelques fois ..) C'est mal.

  1. Si vous utilisez Visual Studio, vous feriez mieux de revenir à VS2010. VS2012 et les versions ultérieures n'ont pas été utilisées pour créer ces bibliothèques. Et cela est vrai au moins pour la version 244. Vous pouvez peut-être simplement établir un lien, mais vous obtiendrez des plantages avec des fonctions très basiques.
  2. Si vous utilisez GCC, vous constaterez peut-être que les bibliothèques .a sont vraiment mauvaises. Elles ont été compilées de manière croisée dans Windows pour LINUX. En essayant de créer un lien avec cygwin, MinGw ne fera pas le travail.

Après avoir essayé pendant 2 jours, j'ai décidé que c'était assez de temps perdu et je me suis retiré vers les DLL, qui fonctionnent bien si vous utilisez VS2010.

Que ce ne soit pas une sortie .. Si vous avez réussi à créer un lien, veuillez partager avec nous tous comment :)

3
user1241378

J'ai construit une application qui dépend d'OpenCV 2.4.9 avec une liaison statique.

1) Je viens d'ajouter des dépendances supplémentaires de l'éditeur de liens:

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) Linker => Général => Répertoires de bibliothèque supplémentaires => changé $ (OPENCV_DIR)\x86\vc12\lib en $ (OPENCV_DIR)\x86\vc12\staticlib où OPENCV_DIR est la variable d'environnement définie sur: C:\OpenCV 2.4.9\opencv\build

3) et changé C/C++ => Génération de code => Débogage multithread DLL (MD) en débogage multithread (MTd)

et apprécié la construction réussie.

la même chose fonctionne pour le mode de publication (bien sûr, lien contre les bibliothèques non déboguées)

1
dajuric