2012-02-08 9 views
5

Я пытаюсь построить большую статическую библиотеку, объединяющую две статические библиотеки. В настоящее время я использую команду «ар», извлечение объектов, например, от «аа» и «ба», а затем эти объекты повторной сборки, используя «AR» снова:Как извлечь статические библиотеки, содержащие повторяющиеся файлы объектов?

$ ar x a.a 
$ ar x b.a 
$ ar r merged.a *.o 

К сожалению, это не работает для моей цели, поскольку aa имеет внутри разных объектов с ИМЯ ИМЯ. Команда «ar» извлекает повторяющиеся объекты и заменяет уже извлеченные одноименные имена. Даже с тем же именем эти объекты имеют разные символы, поэтому я получаю неопределенные ссылки, поскольку некоторые символы пропускаются вместе с замененными файлами.

У меня нет доступа к исходным объектам и уже пробовал «ar xP» и «ar xv» и много «арфа». Кто-нибудь может помочь мне показать, как объединить эти библиотеки?

Заранее спасибо.

ответ

3

Я попробовал «ar p», но, поговорив с другом, было решено, что следующее решение python может быть лучше. Теперь можно извлечь повторяющиеся объектные файлы.

def extract_archive(pathtoarchive, destfolder) : 

    archive = open(pathtoarchive, 'rb') 

    global_header = archive.read(8) 
    if global_header != '!<arch>\n' : 
     print "Oops!, " + pathtoarchive + " seems not to be an archive file!" 
     exit() 

    if destfolder[-1] != '/' : 
     destfolder = destfolder + '/' 

    print 'Trying to extract object files from ' + pathtoarchive 

    # We don't need the first and second chunk 
    # they're just symbol and name tables 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    unique_key = 0; 

    while True : 

     content_descriptor = archive.readline() 

     if len(content_descriptor) < 60 : 
      break 

     chunk_size = int(content_descriptor[48:57]) 

     output_obj = open(destfolder + pathtoarchive.split('/')[-1] + '.' + str(unique_key) + '.o', 'wb') 
     output_obj.write(archive.read(chunk_size)) 

     if chunk_size%2 == 1 : 
      archive.read(1) 

     output_obj.close() 

     unique_key = unique_key + 1 

    archive.close() 

    print 'Object files extracted to ' + destfolder + '.' 
+1

Отлично, у меня была такая же проблема, и этот скрипт решил проблему. Но я считаю, что вы должны написать '' 'content_descripter [48:58]' '' вместо 48:57. Поле размера файла составляет 10 байт вместо 9 байтов в соответствии с [Википедия] (https://en.wikipedia.org/wiki/Ar_ (Unix)). –

+1

Кроме того, если вы обрабатываете BSD-вариант формата файла .a (например, на Mac), имя файла может быть частью части тела, как описано в [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). Таким образом, вам также понадобится логика, чтобы раздеть ее. –

0

Вы можете переименовать объекты - их имя ничего не значит при связывании. Это должно сработать:

mkdir merge-objs && 
cd merge-objs && 
ar x ../a.a && 
for j in *.o; do mv $j a-$j; done && 
ar x ../b.a && 
ar r ../merged.a *.o && 
cd .. && rm -rf merge-objs 
+2

Проблема не они» повторяются между архивами, но объекты повторяются внутри одной и той же библиотеки внутри одного и того же архива! Когда 'ar' извлекает их, объекты из одного и того же архива с тем же именем будут перезаписаны.Но спасибо за вашу помощь :) –

1
  1. Вы должны извлечь объекты из статической библиотеки (в библиотеке, которая содержит дублированные объекты)
  2. Затем вы должны создать новую библиотеку из извлеченных объектов.
  3. Новая библиотека будет содержать ТОЛЬКО ОДИН экземпляр дублированных объектов.
  4. Вы должны использовать команду ar t для создания списков объектов из двух библиотек (оригинал - с дубликатами один и новый - без дубликатов).
  5. Затем используйте, например, vimdiff, чтобы проверить различия между двумя списками.
  6. Запишите все различия.
  7. Затем извлечь только те объекты (шаг 6) объекты из исходной библиотеки, с помощью команды ар х my_original_lib.a object.o
  8. Затем переименовать полученный извлеченный объект на любое имя вам нравится
  9. Затем с помощью команды ар м my_original_lib.a object.o переставить object.o
  10. Затем используйте ту же команду, как и шаг 7, и вы извлечет второй object.o
  11. Дайте другое имя вновь извлеченный объект
  12. Используйте их оба для создания новой библиотеки.
  13. Метод содержит для ЛЮБОГО количества дублированных объектов в статической библиотеке. Просто используйте шаг 9 и 7 раз, чтобы извлечь все дубликатов
+0

Код C++, который объединяет многие библиотеки в один новый, без перезаписи возможных дублированных объектов: http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia