AR на существующий файл .a? - PullRequest
       36

AR на существующий файл .a?

3 голосов
/ 01 декабря 2010

По сути, я хочу сделать следующее:

gcc foo.c -o foo.o
ar rcs foo.a foo.o
gcc bar.c -o boo.o
ar rcs bar.a bar.o foo.a

Я хочу заархивировать как объект, так и статическую библиотеку в другую статическую библиотеку. К сожалению, последняя команда не содержит foo.o (она содержит bar.o и foo.a), поэтому, когда я перехожу к этапу компоновки, компоновщик не может найти символы из foo.o.

Есть ли способ сделать то, что я хочу здесь? Я делаю все это не по назначению, поэтому я ищу решение, которое не включает извлечение и повторное архивирование объектов (что кажется довольно болезненным). Есть ли способ заставить этот вид установки «архив из другого архива» работать?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

На самом деле вы не хотите архивировать один целый файл .a внутри другого.Возможно, вы захотите заархивировать элементы одного архива в другом, но это совершенно другая операция.

Программа 'ar' прекрасно способна хранить исходные файлы, сжатые tar-файлы, HTML-файлы, XMLфайлы и почти любой другой тип файла в «.a» (а суффикс «.a» только условный, а не обязательный) - попробуйте это время.Тем не менее, он обрабатывает объектные файлы (и только объектные файлы) специально и делает их доступными для использования компоновщиком ('ld'), но компоновщик использует такие файлы только в том случае, если расширение равно .a.

Итак, вы хотите иметь две библиотеки:

  1. foo.a, содержащие только foo.o
  2. bar.a, содержащие bar.o и все объекты из foo.a

За исключением того, что вы предлагаете и извлекаете объекты из foo.a и встраиваете их в bar.a, единственной альтернативой является перечисление членов foo.a в качестве членов bar.a также:

FOO_OBJS = foo.o
BAR_OBJS = bar.o $(FOO_OBJS)

foo.a: $(FOO_OBJS)
    $(AR) $(ARFLAGS) $@ $(FOO_OBJS)
bar.a: $(BAR_OBJS)
    $(AR) $(ARFLAGS) $@ $(BAR_OBJS)

Я предполагаю, что ваш пример сведен к минимуму.Если это не так, то зачем возиться с двумя библиотеками.Все, что использует только код из foo.o, будет связывать только foo.o, даже если для ссылки есть bar.a.(Было бы немного по-другому, если бы это были общие объекты, но, вероятно, было бы лучше использовать только один, а не два общих объекта.)

2 голосов
/ 01 декабря 2010
ar rcs foo.a foo.o
cp foo.a foo2.a
gcc -c bar.c
ar rs foo2.a bar.o

И, возможно, используйте foo.a вместо foo2.a, если вам не нужно сохранять его в первоначальном виде.

...