.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.c
world.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.
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. –
@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. –
bueno saber. Gracias. –