utilizando bibliotecas estáticas en lugar de bibliotecas dinámicas en opencv

Tengo un proyecto en visual studio 2012 que usa bibliotecas dinámicas de opencv. Recopiló, vinculó y trabajó bien.

Quiero cambiar el proyecto para que use bibliotecas estáticas en lugar de bibliotecas dinámicas.

Cambié los directorios de la biblioteca en el directorio del proyecto VC ++ de

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

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

pero cuando quiero construir el proyecto, recibo muchos errores del enlazador, como:

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

y más importante aún, muchos errores como este:

  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) 

¿Qué otros cambios debo hacer para convertir un proyecto que usa bibliotecas dinámicas para usar bibliotecas estáticas?

Editar 1

Después de cambiar / md a / mt y agregar algunas nuevas bibliotecas a la lista de bibliotecas de entrada:

 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 

Estoy recibiendo algunos errores nuevos:

 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) 

Aparentemente falta una biblioteca, pero ¿cuál?

Editar 2 necesita agregar más biblioteca a la lista. La lista completa de la biblioteca es la siguiente:

 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 

Esto resolvió el problema.

Puedo obtener las bibliotecas estáticas que funcionan en VS 2013 cambiando la biblioteca de tiempo de ejecución del proyecto a / MTd

enter image description here

y luego incluir estos Linker >> Input >> Additional Dependencies:

 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 

Si está creando con CMake, es muy simple porque es una de las opciones de OpenCV CMake; simplemente ajuste BUILD_WITH_STATIC_CRT en off. P.ej. en la línea de comando CMake

 -DBUILD_WITH_STATIC_CRT=OFF 

Para Visual Studio 2012 con OpenCV 3.0.0, estos problemas aún se aplican, y las soluciones en este hilo son relevantes. Aquí está mi configuración para que funcione:

Variables de entorno del sistema de Windows

Establecido en las variables de entorno del sistema de Windows: OPENCV_DIR = D:\OpenCV\build\x64\v11 (reemplace D:\OpenCV\ con cualquiera que sea su ruta a opencv. También, x64 para máquinas de 64 bits, x86 para máquinas de 32 bits )

Utilice staticlib para AdditionalLibraryDirectories

Establezca los Directorios de biblioteca adicionales (Ver> Páginas de propiedades> Propiedades de configuración> Enlazador> General> Directorios de biblioteca adicionales) en: $(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

Biblioteca de ejecución

Cambie la Generación de código> Biblioteca de tiempo de ejecución a Multi-threaded Debug (/MTd) por respuesta del usuario , de lo contrario obtendrá este tipo de error:

 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 

Finalmente, la lista de Dependencias Adicionales

Mis dependencias adicionales deben incluir todos los nombres de biblioteca en el directorio staticlib . Tenga en cuenta los números de versión ; ya que estoy usando OpenCV 3.0.0, los nombres de archivo terminan con * 300d.lib. Creo que comctl32.lib y vfw32.lib no están en staticlib, pero los agregué por si acaso (Ver> Páginas de propiedades> Propiedades de configuración> Vinculador> Entrada> Dependencias adicionales):

 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

También me encontré con este problema que VS2012 afirma que la máquina de destino no coincide con el tipo de máquina de módulo como este tipo . La solución se da aquí .

Tío, déjame decirte … he estado allí hecho eso … Intenté la cosa de la lib estática (un par de veces …) Es malvado.

  1. Si está usando Visual Studio, es mejor que se vuelva a degradar a VS2010. VS2012 y posteriores no se usaron para construir estas bibliotecas. Y eso es cierto al menos para la versión 244. Puede que solo sea capaz de vincular, pero obtendrá lockings con funciones muy básicas. Así que siéntase a sí mismo.
  2. Si usa GCC, puede que descubra que las .a libs son realmente malas. Se comstackron cruzadas en Windows para LINUX. Tratando de vincularse con cygwin, MinGw no hará el trabajo.

Después de intentar durante 2 días, decidí que se desperdició suficiente tiempo y me retiré a la DLL, que funciona bien si usa VS2010.

Que no sea un desvío … Si lograste unir, por favor comparte con todos cómo 🙂

Tengo una aplicación que depende de OpenCV 2.4.9 con enlaces estáticos.

1) Acabo de agregar dependencias adicionales del enlazador:

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 => General => Directorios de biblioteca adicionales => changed $ (OPENCV_DIR) \ x86 \ vc12 \ lib a $ (OPENCV_DIR) \ x86 \ vc12 \ staticlib donde OPENCV_DIR es la variable de entorno establecida en: C: \ OpenCV 2.4.9 \ opencv \ build

3) y se modificó C / C ++ => Generación de código => DLL de depuración de varios subprocesos (MD) para depuración de subprocesos múltiples (MTd)

y disfruté de la construcción exitosa.

lo mismo funciona para el modo de lanzamiento (por supuesto enlace contra libs sin depuración)