2012-02-08 9 views
5

Próbuję zbudować dużą bibliotekę statyczną łączącą dwie statyczne biblioteki. W tej chwili używam komendy „AR”, wyodrębnianie obiektów, na przykład z „AA” i „ba”, a następnie ponownym tych obiektów za pomocą „AR” znowu:Jak mogę wyodrębnić statyczne biblioteki zawierające powtarzające się pliki obiektów?

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

Niestety to nie działa dla mojego celu, ponieważ aa ma wewnątrz różne przedmioty z NAZWĄ SAMEGO. Polecenie "ar" wyodrębnia powtarzane obiekty i zastępuje już wyodrębnione te o tej samej nazwie. Nawet przy tej samej nazwie obiekty te mają różne symbole, więc otrzymuję niezdefiniowane odniesienia, ponieważ niektóre symbole są pomijane wraz z zastąpionymi plikami.

Nie mam dostępu do oryginalnych obiektów i próbowałem już "ar xP" i "ar xv" oraz dużo "ar rzeczy". Czy ktoś może mi pomóc pokazać jak połączyć te biblioteki?

Z góry dziękuję.

Odpowiedz

3

Próbowałem "ar p", ale rozmawiając z przyjacielem zdecydowano, że następujące rozwiązanie Pythona może być lepsze. Teraz można wyodrębnić powtarzające się pliki obiektów.

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

Świetnie, miałem ten sam problem i ten skrypt rozwiązał problem. Ale uważam, że powinieneś napisać '' content_descripter [48:58] '' 'zamiast 48:57. Pole rozmiaru pliku wynosi 10 bajtów zamiast 9 bajtów zgodnie z [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). –

+1

Ponadto, jeśli obsługujesz wariant BSD w formacie .a (np. Na Macu), nazwa pliku może być częścią części ciała, jak wyjaśniono w [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). Więc potrzebujesz logiki, aby go rozebrać. –

0

Możesz zmieniać nazwy obiektów - ich nazwa nic nie znaczy podczas łączenia. To powinno zadziałać:

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

Problemem nie jest to, że” powtórzone pomiędzy archiwami, ale obiekty powtarza się w tej samej bibliotece, w tym samym archiwum! Kiedy 'ar' wyodrębnia je, obiekty z tego samego archiwum o tej samej nazwie zostają nadpisane.Ale dzięki za pomoc :) –

1
  1. Trzeba wyodrębnić obiekty z biblioteki statyczne (biblioteki, która zawiera duplikatów obiektów)
  2. Następnie trzeba budować nową bibliotekę z wydobytych przedmiotów.
  3. Nowa biblioteka będzie zawierać TYLKO JEDNĄ instancję zduplikowanych obiektów.
  4. Musisz użyć polecenia ar t, aby utworzyć listy obiektów z dwóch bibliotek (oryginał - z duplikatem jeden i nowy - bez duplikatów).
  5. Następnie użyj np. Vimdiff, aby sprawdzić różnice między dwiema listami.
  6. Zapisz wszystkie różnice.
  7. następnie wyodrębnić jedynie te przedmioty (etap 6) przedmioty z pierwotnej biblioteki za pomocą polecenia ar x my_original_lib.a object.o
  8. Następnie nazwy wytworzonego wyodrębnione obiektu na dowolną nazwę
  9. Następnie za pomocą polecenia ar m my_original_lib.a object.o aby zmienić object.o
  10. Następnie użyj tego samego polecenia, jak krok 7 i będzie można wyodrębnić drugim object.o
  11. Podaj inną nazwę dla nowo wydobytego obiektu
  12. Użyj ich obu, aby zbudować nową bibliotekę.
  13. Metoda zawiera DOWOLNĄ liczbę zduplikowanych obiektów w bibliotece statycznej. Wystarczy skorzystać z kroku 7 i 9 razy, aby wyodrębnić wszystkie dublicates
+0

Kod C++, który łączy wiele bibliotek w jeden nowy, bez nadpisywania możliwych zduplikowanych obiektów, znajduje się tutaj: http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia

Powiązane problemy