Агрегировать статические библиотеки - PullRequest
3 голосов
/ 03 марта 2012

Я пытаюсь объединить несколько файлов .a в один.Команда выглядит следующим образом:

TARGET=libnumpy.a
DIR=build/lib.linux-x86_64-2.6/numpy
FILES=$(DIR)/core/_sort.a $(DIR)/core/multiarray.a $(DIR)/core/umath.a $(DIR)/core/scalarmath.a $(DIR)/core/umath_tests.a $(DIR)/core/multiarray_tests.a $(DIR)/lib/_compiled_base.a $(DIR)/numarray/_capi.a $(DIR)/fft/fftpack_lite.a $(DIR)/linalg/lapack_lite.a $(DIR)/random/mtrand.a

all:
    ar cr $(TARGET) $(FILES)

Но полученная библиотека libnumpy.a непригодна для использования.При попытке что-то скомпилировать я получаю

libnumpy.a: could not read symbols: Archive has no index; run ranlib to add one

(я пытался запустить ranlib, но это не решило проблему)

При выполнении nm libnumpy.a я получаю

nm: _sort.a: File format not recognized
nm: multiarray.a: File format not recognized
nm: umath.a: File format not recognized 
nm: scalarmath.a: File format not recognized
nm: umath_tests.a: File format not recognized
nm: multiarray_tests.a: File format not recognized
nm: _compiled_base.a: File format not recognized
nm: _capi.a: File format not recognized
nm: fftpack_lite.a: File format not recognized
nm: lapack_lite.a: File format not recognized
nm: mtrand.a: File format not recognized

Что с этим не так?

Ответы [ 2 ]

4 голосов
/ 03 марта 2012

Вы добавляете архивные файлы в архивный файл.Вы не должны этого делать, вы должны помещать объектные файлы в архив.

Один из способов, если у вас есть GNU ar, это создавать тонкие архивы (с переключателем T):

GNU ar может по желанию создать тонкий архив, который содержит индекс символа и ссылки на оригинальные копии файлов-членов архивов.Такой архив полезен для создания библиотек для использования в локальной сборке, где предполагается, что перемещаемые объекты будут оставаться доступными, а копирование содержимого каждого объекта будет только тратить время и пространство. Тонкие архивы также сглаживаются, поэтому при добавлении одного или нескольких архивов в тонкий архив элементы вложенного архива будут добавляться по отдельности. Пути к элементам архива сохраняются относительно самого архива.

В противном случае заархивируйте все отдельные файлы .o, которые содержат исходные файлы .a.

2 голосов
/ 03 марта 2012

Как упомянуто @Mat:

#ar x <archivefile>  / * Repeat for all archives */
#ar cv <all Obj fiels>
...