file extension - extension - ¿Cuál es la diferencia entre los archivos.lib y.a?
file extensions list (4)
Estoy intentando compilar estáticamente algo y estoy tratando de entender qué son todas estas dependencias. Sé que los archivos .dll son para dependencias dinámicamente vinculadas que serán requeridas por el resultado final, pero ¿qué son los archivos .a y .lib y cuándo los necesita cada uno?
.a es un archivo de código: compilado pero no vinculado. Deberías vincularlo estáticamente con él durante el paso del enlace final de tu programa.
.lib puede ser el mismo que .a, o una llamada "biblioteca de importación" mágica: un marcador de posición fino que hace que necesites un .dll en tiempo de ejecución.
Algo que no veo mencionar aquí todavía es el hecho sorprendente de que, al menos algunas veces, los archivos .a y .lib son en realidad el mismo formato binario . Aunque no pude encontrar nada que diga tanto en el sitio web de mingw, noté que al intentar obtener el compilador de clúster de 64 bits de MS Visual C ++ para vincularlo en un archivo .dll producido utilizando el compilador mingw-w64 g ++, felizmente aceptado la línea de comando
cl /EHsc /Ipath/to/include gmp_test.cpp path/to/lib/libgmp.dll.a
y el archivo .exe resultante se ejecutó correctamente tan pronto como coloque una copia del archivo .dll correspondiente en el directorio actual. (Murmuró la advertencia "Advertencia de línea de comando D9024: tipo de archivo fuente no reconocido ''ruta / a / lib / gmp-6.0.0 / lib / libgmp.dll.a'', se supone que el archivo de objeto es".)
Otra evidencia es que el comando de file
Linux informó "archivo ar actual" para varios archivos de cada extensión (.lib o .a) que probé.
Por lo general, .a es para bibliotecas estáticas en Linux mientras que .lib es para lo mismo pero en Windows. Pero, por supuesto, es solo una convención.
En los sistemas Unix, tiene los archivos .a
. Estos son archivos simples de archivos de objetos ( .o
).
En Windows, hay archivos .lib
, que son bastante parecidos, pero para Windows en lugar de Unix.
Una sutileza adicional es que para vincular un código con un archivo DLL (en Windows), debe establecer un vínculo con un archivo .lib
que contenga envolturas simples que invoquen el archivo DLL. En el sistema Unix, tradicionalmente, no hay necesidad de tales envoltorios (el enlazador es lo suficientemente inteligente como para generarlos sobre la marcha).