Немного используемая особенность архиватора GNU - скрипт архивирования, это простой, но мощный интерфейс, который может выполнять именно то, что вы хотите, например, если следующий скрипт называется script.ar:
CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END
Тогда вы можете вызвать ar следующим образом:
ar -M < script.ar
и вы получите libNewColor.a, который содержит все файлы .o из libColor.a libRGB.a и libPixel.a.
Кроме того, вы также можете добавить обычные файлы .o, а также команду ADDMOD:
CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END
Кроме того, эти сценарии очень просто генерировать в Makefiles, поэтому я обычно создаю несколько универсальное правило make-файла для создания архивов, которое фактически генерирует сценарий и вызывает ar в сценарии. Примерно так:
$(OUTARC): $(OBJECTS)
$(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
$(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
$(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
$(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
$(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
$(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)
Хотя теперь, когда я смотрю на это, я думаю, что это не сработает, если $ (OBJECTS) пусто (т.е. если вы просто хотите объединить архивы без добавления дополнительных объектных файлов), но я оставлю это в качестве упражнения для читателя чтобы исправить эту проблему, если это необходимо ...: D
Вот документы для этой функции:
https://sourceware.org/binutils/docs/binutils/ar-scripts.html#ar-scripts