2011-01-10 25 views
7

e.exe está vinculada a mi biblioteca estática personalizada, c.lib, que usa Win32 API definida en w.dll. w.dll se encuentra en C: \ Windows \ System32 y su biblioteca de importación es w.lib, ubicada en el directorio Windows SDK. Shell w.lib aparece como Dependencia adicional en c.lib o e.exe proyecto? (e.exe se construye con éxito en ambos casos.) ¿Cuál es la mejor práctica y por qué? Supongo que e.exe no debería saber acerca de w.lib.Biblioteca estática con dependencias

c.lib está destinado a ser compartido solo entre un grupo de desarrolladores (no para ser enviado a los clientes).

TEST: I utiliza VS2008 y dumpbin utilidad para poner a prueba ambos casos y aquí están los resultados:

  • Caso 1: w.lib añadió como dependencia adicional en c.lib proyecto.

dumpbin /archivemembers c.lib listas de salida ambas compensaciones en w.dll y archivos .obj de c.lib proyecto como miembros del archivo.

  • Caso 2: w.lib no se agrega como dependencia adicional enc.lib pero en e.exe proyecto:

Esta vez, dumpbin salida contiene sólo los archivos .obj de c.lib y el tamaño de c.lib es menor que en el asunto 1

(c.lib se añadió como dependencia adicional en w.exe proyecto en ambos casos)

NOTA:. I utiliza w.lib y w.dll aquí como ficticia, nombres genéricos para las bibliotecas de Windows pero podrían ser, por ejemplo, Userenv.lib y Userenv.dll o Version.lib y Version.dll ...

Respuesta

1

Creo que está malinterpretando lo que hace la creación de un archivo y un archivo de importación.

Creando un archivo, como correctamente ha conjeturado en los comentarios, crea un archivo unificado que contiene .objs compilados. Ahora, esto puede contener cualquier código que desee, incluidas, entre otras, llamadas dinámicas a bibliotecas. Una biblioteca de importación es una biblioteca que contiene un obj que hace exclusivamente llamadas, la idea es que al importarlo, su ejecutable puede encontrar los símbolos apropiados (deben estar en el ejecutable que usted cree).

El proceso de creación c.lib de w.lib simplemente extrae objetos w.lib 's y los añade a la colección de objetos en c.lib. En efecto, c.lib se convierte en una biblioteca de importación + código.

¿Pienso que deberías hacer esto? En realidad, no; podría generar confusión sobre qué depende e.exe; Creo que deberías hacer esto visible de forma explícita en lugar de tratar de ocultarlo. Dicho eso, esa es solo una recomendación, no una regla.

+0

Gracias por la respuesta exhaustiva. Mi presunción inicial era incorrecta: pensé que era deseable no conocer las dependencias de lib, pero ahora, cuando lo miro desde el punto de vista * import library + code *, tiene sentido que el exe sepa cuál es su código (que en realidad incluye código de lib estático) depende de. –

+1

Estoy confundido por esta respuesta. ¿No es común construir bibliotecas sobre bibliotecas? Cualquier biblioteca extendida se consideraría "biblioteca de importación + código". Creo que es una buena práctica ocultar los detalles de la biblioteca que se está construyendo. – jwalk

0

Las bibliotecas no están vinculadas, por lo que cualquier proyecto que utilice .lib también necesita sus dependencias.

Básicamente, los .lib se "copian" a su ejecutable durante la vinculación.

Si desea evitar que sus usuarios vuelvan a vincularse explícitamente w.lib, transforma c.lib en dll, los dlls están vinculados y no necesita sus dependencias durante la compilación.

+0

Entiendo que 'link.exe' no resuelve las referencias externas sino que simplemente comprime un conjunto de archivos' obj' para crear una biblioteca estática. Mi pregunta era sobre las dependencias en tiempo de compilación: el caso 1 muestra que 'e.exe' no sabía nada de' w.lib'. Por supuesto, 'w.dll' debe estar presente en tiempo de ejecución. –

Cuestiones relacionadas