2009-01-25 26 views
9

En Visual C++, cuando construyo un dll, los archivos de salida son .dll y .lib.Al compilar un archivo DLL, ¿el archivo LIB generado contiene el nombre de la DLL?

Es el nombre del dll integrado en el archivo .lib.

La razón por la que hago esta pregunta es: Cuando construí mi exe importando este dll y ejecuto el exe, el exe intenta localizar el dll para cargarlo en el espacio de direcciones de proceso.

Como solo especificamos el nombre de la biblioteca (archivo .lib) en las propiedades del proyecto, ¿cómo consigue el exe conocer el nombre de la DLL?

Nota: I dumpbin libary file (.lib) y vi que no contiene el nombre de la dll.

Respuesta

15

El archivo LIB se convierte en una tabla de importación en el EXE. Este does contiene el nombre de la DLL.

Puede ver esto si ejecuta dumpbin /all MyDLL.lib. Tenga en cuenta que dumpbin MyDll.lib por sí solo no muestra nada útil: debe usar /all.

Esto muestra todas las secciones definidas en el archivo .LIB. Puede ignorar cualquier sección .debug, ya que no estarían presentes en una compilación de versión. En el archivo .LIB, hay una colección de secciones .idata. En el proyecto DLL que acaba de construir, el archivo LIB contiene una sección .idata$4 que define los símbolos que se ponen en la tabla de importación del archivo EXE, incluyendo el nombre del archivo DLL:

Archive member name at 83E: MyDll.dll/  
497C3B9F time/date Sun Jan 25 10:14:55 2009 
     uid 
     gid 
     0 mode 
     2E size 
correct header end 

    Version  : 0 
    Machine  : 14C (x86) 
    TimeDateStamp: 497C3B9F Sun Jan 25 10:14:55 2009 
    SizeOfData : 0000001A 
    DLL name  : MyDll.dll 
    Symbol name : [email protected]@YAHXZ (int __cdecl fnMyDll(void)) 
    Type   : code 
    Name type : name 
    Hint   : 2 
    Name   : [email protected]@YAHXZ
+0

Sí, la sección de importación del exe contiene el nombre de la dll. Pero llega a saber el nombre de la biblioteca como dices. Entonces, ¿te refieres a que la biblioteca contiene el nombre? Si es así, ¿por qué no lo veo cuando dumpbin la biblioteca. –

+0

... porque no está ejecutando DUMPBIN correctamente? Pase el interruptor/ALL, y luego debería ver una salida similar a la que incluí. –

+0

Gracias. Ahora entiendo el concepto. –

2

Sí, el lib contiene el nombre de la DLL.

Funcionalmente, la biblioteca de importación implementa las llamadas LoadLibrary y GetProcAdress, y hace que las funciones exportadas estén disponibles como si estuvieran vinculadas estáticamente.

La ruta de búsqueda es la misma que la documentada para LoadLibrary, pero el nombre es fijo.

0

Como señalaron Roger y Peter, sí, el archivo .lib contiene el nombre del archivo .dll. Y gracias a Roger por señalar que dumpbin muestra el nombre del archivo .dll, esto me ayudó a resolver mi problema. Que se relaciona con el origen del nombre en el archivo .lib.

Estaba esperando que se tomara el nombre de la configuración del proyecto para el proyecto dll pero teníamos un export.def que especificaba el nombre para el dll. Así que tuvimos problemas al usar nuestro dll cuando cambié la configuración del proyecto pero no export.def. La solución para nuestro proyecto fue eliminar el archivo export.def.

Cuestiones relacionadas