2012-06-15 20 views
10

Hay cosas que no entiendo cuando se trata de vincular ... Estoy escribiendo un programa usando una biblioteca de terceros (la biblioteca GEOS). Este programa tiene una dependencia de geos.lib pero aún necesita geos.dll para ejecutarse.Programa enlazado estáticamente a una biblioteca pero aún necesita ejecutar dll

He leído this question, creo que entiendo la diferencia entre bibliotecas estáticas y dinámicas. Lo que no entiendo es por qué todavía necesito un dll cuando conecto estáticamente una biblioteca.

Respuesta

16

No está vinculado de forma estática. .lib es solo una biblioteca de stub que enlaza en .dll en windows. Es decir, enlazas con .lib en tiempo de compilación, y luego en tiempo de ejecución buscará el .dll.

+0

¿No hay opciones que permitan vincular estáticamente el código del archivo .dll particular? –

+1

Creo que tiene que compilar la biblioteca para la vinculación estática, no estoy seguro de que pueda convertir una dll en una biblioteca enlazada estáticamente después de que se haya compilado. –

+0

@Andrew Los archivos dll siempre vienen con un .lib? ¿Cómo sé cuando el archivo .lib no es suficiente y necesito proporcionar dll? – undu

0

Definitivamente está enlazando a una biblioteca dinámica. El hecho de que el vinculador requiera .lib no significa que estés enlazando a una biblioteca estática.

0

Puede vincular estáticamente el archivo lib si y solo si se trata de un archivo lib estático. Entonces primero necesita convertir el proyecto de su dll a la lib estática, compilarlo y luego usar el producto de su compilación que será un archivo .lib estático.

18

Hay 3 tipos de bibliotecas en Windows:

  • biblioteca de objetos (* .lib)
  • biblioteca de importación (* .lib)
  • librería dinámica (* .dll)

bibliotecas de objetos están vinculadas estáticamente. Contienen las definiciones de objeto completo del código abstraído por la biblioteca.

importar bibliotecas es una forma especial de una biblioteca de objetos. En lugar de contener código, contienen información para el vinculador que finalmente asigna el archivo ejecutable a la biblioteca de enlace dinámico.

bibliotecas de vínculos dinámicos, como bibliotecas de objetos, código de suministro para su programa. Sin embargo, este código se carga en tiempo de ejecución y no se compila en su exe.

No siempre es necesario vincular una biblioteca de importación. En su lugar, puede llamar a LoadLibrary() y buscar los puntos de entrada de API por nombre u ordinal. (Siempre debe indicarle al código qué DLL y en qué API del DLL desea ingresar).

Los otros comentarios son correctos porque no se puede convertir un archivo DLL en una lib estática sin recompilar el código de la biblioteca - es un tipo diferente de salida.

+4

[Guía para principiantes de enlazadores] (http://www.lurklurk.org/linkers /linkers.html) es un excelente artículo sobre enlaces. Lo encontré esta semana mientras investigaba esta misma pregunta. – Pressacco

1

Si .lib fue creado por Visual Studio, entonces verifique el valor de las propiedades del proyecto -> Enlazador -> Entrada -> Archivo de definición del módulo. Si no está vacío, link.exe creará la biblioteca de stub en lugar de la biblioteca estática, incluso si Propiedades del proyecto -> General -> Tipo de configuración es "Biblioteca estática (.lib)".

Cuestiones relacionadas