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.
- 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.
- 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