2009-03-17 18 views
43

¿Cuál es la diferencia entre estos dos tipos de archivos? Veo que mi aplicación C++ se vincula con ambos tipos durante la construcción del ejecutable..o archivos vs .a archivos

Cómo compilar archivos .a? enlaces, referencias y especialmente ejemplos, son muy apreciados.

Respuesta

46

.o Los archivos son objetos. Son el resultado del compilador y la entrada al vinculador/bibliotecario.

.a archivos son archivos. Son grupos de objetos o bibliotecas estáticas y también se ingresan en el enlazador.

contenido adicional

no me di cuenta la parte "ejemplos" de su pregunta. En general, utilizará un archivo MAKE para generar bibliotecas estáticas.

AR = ar 
CC = gcc 

objects := hello.o world.o 

libby.a: $(objects) 
    $(AR) rcu [email protected] $(objects) 

%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

Esto compilará y hello.cworld.c en objetos y luego archivarlos en la biblioteca. Dependiendo de la plataforma, también puede necesitar ejecutar una utilidad llamada ranlib para generar la tabla de contenido en el archivo.

Una nota interesante: .a archivos son archivos de archivo y no bibliotecas. Son análogos a los archivos comprimidos sin compresión, aunque usan un formato de archivo mucho más antiguo. La tabla de contenido generada por las utilidades como ranlib es lo que hace que un archivo sea una biblioteca . Los archivos de almacenamiento de Java (.jar) son similares en cuanto a que son archivos zip que tienen algunas estructuras de directorio especiales creadas por el archivador de Java.

+1

Esto es sobre el tema de hacer, pero solo pensé que me gustaría añadir, también se puede sustituir '$ (objetos)' en la línea de la receta ('$ (AR) rcu $ @ $ (objetos) ') del objetivo' libby.a' con '$ <' o '$ ^' para hacer referencia al primer o todos los requisitos previos, respectivamente.Esto tendrá el mismo efecto, pero también elimina la redundancia de especificar '$ (objetos)' dos veces, necesitando actualizar la referencia en dos lugares si el nombre de la variable o los requisitos previos cambian, y también resulta ser menos código. –

+1

@ShammelLee - Normalmente evito '$ ^' ya que es una extensión GNU Make y no está presente en [make BSD] (https://www.freebsd.org/cgi/man.cgi?make (1)) o en [POSIX make] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html). No me importa mucho ya que la mayoría de las distribuciones de Linux están basadas en GNU, pero el cambio de '/ bin/sh' de bash a dash fue suficiente para hacer que continuara evitando las extensiones específicas de GNU. –

+0

bueno saber. Gracias. –

1

Creo que un archivo .a es un archivo que puede contener varios archivos de objeto.

14

Un archivo .o es el resultado de compilar una sola unidad de compilación (esencialmente un archivo de código fuente, con archivos de encabezado asociados) mientras que un archivo .a es uno o más archivos .o empaquetados como una biblioteca.

5

Se puede utilizar para crear ar.a archivo (biblioteca estática) de .o archivos (archivos de objetos)

Ver man ar para más detalles.

11

D La respuesta de Shawley es buena, solo quería agregar un par de puntos porque otras respuestas reflejan una comprensión incompleta de lo que está sucediendo.

Tenga en cuenta que los archivos (.a) no se limitan a contener archivos de objeto (.o). Pueden contener archivos arbitrarios. No suele ser útil, pero vea dynamic linker dependenciy info embedded in an archive para obtener un truco de enlazador estúpido.

Observe también que los archivos de objeto (.o) no son necesariamente el resultado de una sola unidad de compilación. Es posible vincular parcialmente varios archivos de objeto más pequeños en un solo archivo más grande.

http://www.mihaiu.name/2002/library_development_linux/ - búsqueda en esta página para "parcial"

Cuestiones relacionadas