Команда ar

Команда ar позволяет использовать утилиту для архивации данных с соответствующим именем. Эта утилита поддерживает собственный формат архивов (.a или .ar). Она достаточно редко используется для архивации обычных файлов, в отличие от популярной утилиты tar. При этом следует отметить, что архивы формата ar в текущее время используются в качестве  контейнеров первого уровня в пакетах программного обеспечения формата DEB, а также в качестве контейнеров для хранения файлов объектного кода в статических библиотеках. В случае пакета формата DEB в архиве формата ar хранятся файл с номером версии формата (debian-binary), а также архивы (форматов tar.gz, tar.bz2 или tar.lzma) с описанием пакета программного обеспечения (control) и файлами программного компонента (data).

Структура DEB-пакета
Структура DEB-пакета

Базовый синтаксис команды выглядит следующим образом:

$ cpio [параметры] имя_архива файлы...

Для создания архива должен использоваться параметр r, позволяющий заменить существующие или добавить новые файлы в архив (для создания статической библиотеки следует использовать параметр cr). Для извлечения всех файлов из архива предназначен параметр x. Извлеченные файлы будут сохраняться в текущей директории. Если вам нужно получить список всех файлов из архива, вы можете воспользоваться параметром t, причем существует также параметр p, позволяющий вывести содержимое всех находящихся в архиве файлов. Для удаления файла из архива предназначен параметр d.

Примеры использования

Создание архива

Для создания архива достаточно использовать параметр r:

$ ar r texts.ar *.txt
ar: создаётся texts.ar

В результате в текущей директории будет создан архив texts.ar

Вывод списка файлов архива

Для вывода списка файлов архива предназначен параметр t:

$ ar t texts.ar
Trushkin_Duel_s_nevidimkoy.187097.txt
Trushkin_Koshki-myishki_s_mafiey.196205.txt
Trushkin_Vse_yavnoe_stanovitsya_taynyim.196206.txt

Вывод списка файлов осуществляется без каких-либо дополнительных данных.

Вывод содержимого файлов архива

Вывод содержимого файлов архива может осуществляться с помощью параметра p:

$ ar t texts.ar

Данная функция полезна исключительно для текстовых файлов малого объема.

Добавление файлов в архив

Для добавления файлов в архив используется уже рассмотренный параметр r:

$ ar r texts.ar nolf228.jpg

В результате в архиве появится новый файл:

$ ar t texts.ar
Trushkin_Duel_s_nevidimkoy.187097.txt
Trushkin_Koshki-myishki_s_mafiey.196205.txt
Trushkin_Vse_yavnoe_stanovitsya_taynyim.196206.txt
nolf228.jpg

Удаление файлов из архива

Удаление файлов из архива осуществляется с помощью параметра d:

$ ar d texts.ar nolf228.jpg

В результате указанный файл будет удален из архива:

$ ar t texts.ar
Trushkin_Duel_s_nevidimkoy.187097.txt
Trushkin_Koshki-myishki_s_mafiey.196205.txt
Trushkin_Vse_yavnoe_stanovitsya_taynyim.196206.txt

Извлечение файлов из архива

Для извлечения файлов из архива предназначен параметр x:

$ ar x texts.ar

В результате все извлеченные файлы появятся в текущей директории.

Создание статической библиотеки

Для создания статической библиотеки следует в первую очередь реализовать саму библиотеку. В нашем случае единственной библиотечной функцией будет функций output(), позволяющая вывести текстовую информацию. Это файл liboutput.c с ее реализацией:

  1. #include "liboutput.h"
  2.  
  3. void output(char *text)
  4. {
  5.         printf("%sn", text);
  6. }

А это заголовочный файл liboutput.h с ее прототипом:

  1. #include <stdio.h>
  2.  
  3. void output(char *text);

Для создания статической библиотеки следует скомпилировать файл исходного кода и воспользоваться утилитой ar:

$ gcc -c liboutput.c
$ ar cr liboutput.a liboutput.o

Теперь нужно создать код основной программы. Это содержимое файла исходного кода testlib.c:

  1. #include "liboutput.h"
  2.  
  3. int main()
  4. {
  5.         output("Test");
  6. }

Теперь нужно скомпилировать программу и связать ее со статической библиотекой:

$ gcc testlib.c -L/home/alexf/nolf228/ -loutput -o testlib

Здесь после параметра -L приведен путь к директории со статической библиотекой, а после параметра -l — имя этой библиотеки без префикса lib. Все остальные параметры компилятора GCC используются без каких-либо изменений.

В результате в текущей директории будет создан бинарный файл с именем testlib. Он использует библиотечную функцию output() и отлично работает:

$ ./testlib
Test

Данный подход может использоваться для распространения бинарных библиотек в том случае, если нет возможности открыть их исходный код. Конечно же, я не рекомендую разрабатывать программное обеспечение с закрытым исходным кодом.