2011-06-20 21 views
23

Para utilizar la función Librarie freeglut, tenía que hacer lo siguiente,¿Cómo funciona .h, .lib y .dll trabaja en conjunto

  • Añadido freeglut.h como un archivo de cabecera
  • Agregado freeGlut.lib como un fichero de recursos
  • copiado freeGlut.dll a mi ventanas/carpeta SysWOW64

Pero, ¿cómo todo este sistema (.h, Lib & .dll) se interrelaciona con los demás?

Lo sé, lo más básico es agregar un archivo de cabecera con declaración de clase y escribir el cuerpo en su respectivo archivo fuente. Finalmente, incluya el archivo de encabezado en la aplicación principal.

+0

posible duplicación: http://stackoverflow.com/q/924485/1441 (¿Cuál es la diferencia entre un archivo de encabezado y una biblioteca?) Et. Alabama. – crashmstr

Respuesta

21

Debe incluir los archivos de encabezado para que el compilador comprenda las declaraciones de varios tipos y funciones que están expuestos/usados ​​por la biblioteca.

Los archivos de biblioteca (lib o dll) contienen el código de objeto al que se vincula el código que utiliza la biblioteca.

para lib el enlace es estático y ocurre en el momento de la compilación. Usar una biblioteca estática (lib) hace que el tamaño del archivo ejecutable aumente porque toda la lib está vinculada a su programa.

para dll el enlace es dinámico y las llamadas se evalúan en tiempo de ejecución. Al usar dll, el tamaño del archivo ejecutable no aumenta porque los dll están vinculados en tiempo de ejecución y por lo general es necesario ubicarlos en rutas predefinidas para que puedan ser vinculado en tiempo de ejecución.

La ventaja de la biblioteca estática sobre dll es que el ejecutable que utiliza la lib es independiente, mientras que en el caso de dll, la DLL debe estar presente en una ruta predefinida sin ejecutar el ejecutable que la utiliza.

+0

pero, lib y dll están ambos en su lugar, ¿a dónde va la solicitud? –

+0

y en el caso de freeGlut, tiene un freeGlut.lib y freeGlut_static.lib. Dice que para uso estático, use freeGlut_static.lib. Contradice con lo que dijiste sobre lib. –

+27

A veces, la lib contiene la implementación completa, otras veces solo contiene stubs que llaman a la DLL. Solo si contiene la implementación completa es un enlace estático. –

18

El archivo de encabezado declara todo para que el compilador sepa que lo proporcionará.

El archivo .lib se utiliza para indicar al vinculador dónde encontrar las implementaciones; normalmente están empaquetadas en el .lib, pero en este caso tiene una biblioteca de importación, por lo que dice "En .DLL que Voy a cargar dinámicamente en tiempo de ejecución ".

El archivo .dll es la implementación y se carga en tiempo de ejecución. Normalmente no copiarías esto a tu carpeta de Sistema sino que los dejarías en la carpeta con tu .exe.

+7

+1: porque hay dos tipos de '.lib'. – rubenvb

+1

¿No parece la capa lib una carga, a menos que ya contenga el código? ¿Es solo para redirigir la solicitud a un archivo dll? ¿o sirve para algún otro propósito? –

+1

No, puede contener implementación de código (como en freeglut_static.lib) o referencias de importación de DLL (como en freeglut.lib) o incluso una combinación de ambos. A .lib es solo una colección de archivos .obj empaquetados por conveniencia. En el caso de importación de DLL necesita algunos datos para identificar dónde se debe importar la función, sí, así que sin poner todos estos metadatos en otro lugar (por ejemplo, como pragmas en el archivo de encabezado) no hay forma de omitirlo. – Rup

3

El archivo .h es necesario para el paso de compilación: declara el conjunto de funciones, estructuras y firmas que están disponibles en FreeGLUT para que el compilador pueda codificar contra ellas.

El archivo .lib es necesario para el paso de enlace: en este punto tendrá un conjunto de archivos de objetos que hacen referencia a las funciones de FreeGLUT pero sin una definición/implementación real de los mismos. En este caso, los definirá como importaciones de DLL desde FreeGLUT.DLL que se resuelven en el momento de la carga.

El archivo .dll es donde realmente vive el código y es necesario para el tiempo de ejecución. Tiene que ir a algún lugar en su camino, o en el directorio desde el que está ejecutando su código, para que Windows pueda encontrarlo. Tenga en cuenta que SysWOW64 es casi seguro el lugar equivocado para ello; es necesario configurar Visual Studio para copiarlo en el directorio bin \ debug o colocarlo en otro lugar y agregar ese directorio al entorno PATH (luego reiniciar Visual Studio para recogerlo).

+0

Gracias por su respuesta. Pero, ¿puedes explicar un poco más sobre el "paso de enlace" y el "archivo de objeto"? –

+0

Tradicionalmente (aunque la línea es un poco borrosa hoy en día), lo que sucede es que sus archivos .cpp individuales se compilan primero en una colección de archivos .obj (los archivos objeto, los verá en su directorio obj \ Debug) que contienen código de máquina más listas de funciones importadas y exportadas que se utilizan para unir los archivos .obj individuales en el programa completo. Eso es [vincular] (http://en.wikipedia.org/wiki/Linker_ (informática)). Además de sus archivos obj, su código se vinculará con la biblioteca de tiempo de ejecución C++ para importar implementaciones de funciones estándar, etc. – Rup

+0

por lo que el archivo lib es en realidad una colección/paquete de archivos obj que se generan a partir del código fuente. Y, verificaciones de paso de enlace es que el código existe o necesita saltar a otra dll. –

Cuestiones relacionadas