una programacion librerías librerias libreria lenguaje estaticas entre dinámicas dinamicas diferencia desarrolladas crea con compilar como clases biblioteca c++ visual-studio opencv

programacion - librerias estaticas y dinamicas c++



usando bibliotecas estáticas en lugar de bibliotecas dinámicas en opencv (5)

Tengo un proyecto en Visual Studio 2012 que usa bibliotecas dinámicas opencv. Compiló, enlazó y funcionó 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 compilar el proyecto, recibo muchos errores de vinculador, como:

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

Y lo que es más importante, 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 bibliotecas nuevas 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 alguna biblioteca, pero ¿cuál?

Edición 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 solucionó el problema.


Amigo, déjame decirte ... he estado allí hecho eso ... Probé la cosa estática (un par de veces ...) Es malvado.

  1. Si está utilizando Visual Studio, es mejor que se vuelva a degradar a VS2010. VS2012 y más no se utilizaron para construir estas bibliotecas. Y eso es cierto, al menos para la versión 244. Es posible que solo puedas enlazar, pero obtendrás fallos con funciones muy básicas ... Así que ahórrate.
  2. Si usa GCC, puede encontrar que las .a libs son realmente malas. Fueron compiladas de forma cruzada en Windows para LINUX. Tratando de vincularse con cygwin, MinGw no hará el trabajo.

Después de intentarlo durante 2 días, decidí que era suficiente tiempo perdido y volví a la DLL, que funciona bien si usas VS2010.

Que no sea un desvío ... Si logró enlazar, por favor, comparta con nosotros cómo :)


He creado una aplicación que depende de OpenCV 2.4.9 con enlace estático.

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 => $ (OPENCV_DIR) / x86 / vc12 / lib a $ (OPENCV_DIR) / x86 / vc12 / staticlib donde OPENCV_DIR es una 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 multihilo (MD) a depuración multihilo (MTd)

y disfrutó de la construcción exitosa.

lo mismo funciona para el modo de lanzamiento (por supuesto, el enlace contra librerías que no son de depuración)


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 del entorno del sistema de Windows

Establecido en las Variables del entorno del sistema de Windows: OPENCV_DIR = D:/OpenCV/build/x64/v11 (reemplace D:/OpenCV/ con cualquiera que sea su ruta hacia 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) según la respuesta de uosɐſ , 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 las bibliotecas en el directorio staticlib . Cuidado con 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 del módulo como este tipo . La solución se da here .


Puedo hacer que las bibliotecas estáticas funcionen en VS 2013 cambiando la Biblioteca en tiempo de ejecución del proyecto a / MTd

y luego incluir estos vinculadores >> Entrada >> Dependencias adicionales:

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á construyendo usando CMake, entonces es muy simple porque es una de las opciones de OpenCV CMake; simplemente desactiva BUILD_WITH_STATIC_CRT. P.ej. en la linea de comando de CMake

-DBUILD_WITH_STATIC_CRT=OFF