c++ - que - objetos dinamicos c#
Enlaces estáticos y dinámicos en Visual Studio (1)
Las cadenas de herramientas de Windows "habituales" ofrecen dos "sabores" de .lib.
Una es las bibliotecas estáticas que mencionas. Cuando se usa, no hay asociado .dll.
La otra es una biblioteca eliminada que solo está allí para enganchar el código para cargar y arreglar punteros de funciones para la biblioteca dinámica en el momento de la carga.
Con las bibliotecas dinámicas (el .dll) puede cargarlo usted mismo (a través de LoadLibrary
) o puede usar el stub (importación) .lib que se le ha proporcionado con el .dll. Favorece la importación .lib si se proporciona una.
¿Por qué tuve que copiar los archivos .dll cuando ya vinculé las bibliotecas estáticas (.lib)?
El .dll debe estar en la ruta, o el directorio con el .exe para que el cargador lo encuentre.
¿Cómo puedo diferenciar si el archivo .lib es biblioteca estática o biblioteca dinámica?
En general, la documentación debe incluir algún nivel de detalle sobre esto. Si se agrupan en la misma carpeta, supongo que el archivo .lib está vinculado al .dll. Si todo lo demás falla, mira el tamaño del archivo; si el .lib está vinculado al .dll, entonces es normalmente pequeño en comparación con el .dll.
Entiendo el concepto de vinculación estática y dinámica. Se sabe que en la plataforma Windows, .dll
son las bibliotecas dinámicas y .lib
son las bibliotecas estáticas.
Mi confusión: hice un proyecto en el que tuve que usar las bibliotecas de OpenCV. Básicamente, tuve que usar las siguientes 5 bibliotecas de OpenCV:
-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio
Para este propósito, en las propiedades del proyecto, tuve que decirle al compilador la ruta de las bibliotecas en el Additional Library Directory
de Additional Library Directory
de VS 2012 y también tuve que decirle al vinculador sobre las bibliotecas .lib
que quiero usar para el proyecto . El proyecto se compiló sin ningún error. Pero cuando intento ejecutar el proyecto, dice que falta videoio.dll
(el mismo error para el resto de las bibliotecas también). Tan pronto como copié los archivos .dll
dentro de la carpeta donde estaba el .exe
, el proyecto funcionó bien.
Pregunta: ¿Por qué tengo que copiar los archivos .dll
cuando ya vinculé las bibliotecas estáticas ( .lib
)?
Pregunta adicional: Cuando uso Eclipse en Mac OS o Linux, solo tengo que decirle al compilador dónde están presentes las bibliotecas de OpenCV y al enlazador qué otras bibliotecas de OpenCV quiero usar. Nunca tuve que colocar las bibliotecas dinámicas en la carpeta .exe
en ese caso.