2009-03-17 2 views
43

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

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

ответ

46

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

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

Дополнительное содержание

я не заметил «примеры» часть вашего вопроса. Как правило, вы будете использовать make-файл для создания статических библиотек.

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] 

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

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

+1

Это на предмет сделать, но просто подумал, что я хотел бы добавить, вы также можете заменить '$ (объекты)' на рецепт линии ('$ (AR) rcu $ @ $ (objects) ') цели' libby.a' с '$ <' или '$ ^' для ссылки на первую или все обязательные цели, соответственно.Это будет иметь тот же эффект, но также удаляет избыточность задания «$ (объектов)» дважды, необходимо обновить ссылку в двух местах, если имя переменной или предпосылки изменится, а также окажется меньше кода. –

+1

@ShammelLee - Я обычно избегаю '$ ^', так как это GNU. Расширяйте и не присутствуйте ни в [BSD make] (https://www.freebsd.org/cgi/man.cgi?make (1)), либо в [POSIX make] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html). Я не имею большого значения, поскольку большинство дистрибутивов Linux очень много основаны на GNU, но переключатель '/ bin/sh' от bash до тире был достаточным, чтобы я продолжал избегать определенных расширений GNU. –

+0

Полезно знать. Благодарю. –

1

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

14

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

5

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

См man ar подробности.

11

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

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

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

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

Смежные вопросы