.o файлы против .a файлы - PullRequest
52 голосов
/ 17 марта 2009

В чем разница между этими двумя типами файлов. Я вижу, что мое приложение C ++ связывается с обоими типами во время создания исполняемого файла.

Как собрать .a файлы? ссылки, ссылки и особенно примеры, высоко ценятся.

Ответы [ 5 ]

58 голосов
/ 17 марта 2009

.o файлы являются объектами. Это выходные данные компилятора и входные данные для компоновщика / библиотекаря.

.a файлы являются архивами. Они представляют собой группы объектов или статические библиотеки и также вводятся в компоновщик.

Дополнительный контент

Я не заметил "примеры" в вашем вопросе. Обычно вы будете использовать make-файл для генерации статических библиотек.

AR = ar 
CC = gcc

objects := hello.o world.o

libby.a: $(objects)
    $(AR) rcu $@ $(objects)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

Это скомпилирует hello.c и world.c в объекты, а затем заархивирует их в библиотеку. В зависимости от платформы вам также может потребоваться запустить утилиту под названием ranlib для создания оглавления в архиве.

Интересное примечание: .a файлы технически архивные файлы , а не библиотеки. Они аналогичны zip-файлам без сжатия, хотя используют гораздо более старый формат файла. Оглавление, сгенерированное такими утилитами, как ranlib, делает архив библиотекой . Архивные файлы Java (.jar) похожи в том, что они представляют собой zip-файлы, которые имеют некоторые специальные структуры каталогов, созданные архиватором Java.

14 голосов
/ 17 марта 2009

Файл .o является результатом компиляции одного модуля компиляции (по сути, файла исходного кода со связанными файлами заголовков), в то время как файл .a представляет собой один или несколько файлов .o, упакованных в виде библиотеки.

11 голосов
/ 17 марта 2009

D Ответ Шоули хорош, я просто хотел добавить пару моментов, потому что другие ответы отражают неполное понимание происходящего.

Имейте в виду, что архивные файлы (.a) не ограничиваются содержанием объектных файлов (.o). Они могут содержать произвольные файлы. Не часто полезно, но см. информация о динамической зависимости компоновщика, встроенная в архив , для хитрого трюка с компоновщиком.

Также обратите внимание, что объектные файлы (.o) не обязательно являются результатом одного модуля компиляции. Можно частично связать несколько меньших объектных файлов в один больший файл.

http://www.mihaiu.name/2002/library_development_linux/ - поиск на этой странице для "частичного"

5 голосов
/ 17 марта 2009

Вы можете использовать ar для создания .a файла (статической библиотеки) из .o файлов (объектных файлов)

Подробнее см. man ar.

2 голосов
/ 17 марта 2009

Я считаю, что файл .a - это архив, который может содержать несколько объектных файлов.

...