Mam 2 statycznych bibliotek Linux, stworzone przez ar cr
, libabc.a
i libxyz.a
.
Chcę połączyć je w jedną bibliotekę statyczną libaz.a
.
Jak mogę to zrobić.
Chcę utworzyć scaloną bibliotekę statyczną, aby nie przekazywać obu bibliotek do końcowego łącza aplikacji.
linux
static-libraries
ar
osgx
źródło
źródło
libtool
libtool -static -o new.a old1.a old2.a
Odpowiedzi:
Możesz wyodrębnić obiekt z obu
.a
plików i utworzyć.a
plik przy użyciu wyodrębnionych plików.o
:źródło
libabc.a
może zawierać obiekty o tej samej nazwie (pochodzące z różnych katalogów) - ponowny montaż nie będzie wtedy działał!ar -c
nie działa dla mnie (Ubuntu 14.04). Mamar: no operation specified
.ar -qc
Zamiast tego zrobiłem i to działało dobrze.Można to zrobić natywnie na co najmniej trzy sposoby . Pierwszym i najbardziej przenośnym sposobem jest użycie libtool. Po zbudowaniu innych bibliotek, również za pomocą libtool, możesz je połączyć, po prostu dodając .la libs do zmiennej automake libaz_la_LIBADD lub bezpośrednio z pliku Makefile z czymś takim:
Pozostałe dwa są dostępne przynajmniej podczas używania GNU ar. Możesz użyć skryptu MRI (nazwanego na przykład libaz.mri), takiego jak:
a następnie wykonaj ar jako:
Lub możesz użyć cienkiego archiwum (opcja
-T
), które pozwoli na dodanie innych archiwów bez zagnieżdżania ich w środku, chociaż wadą jest to, że jeśli chcesz dystrybuować bibliotekę statyczną, będzie brakować odłączonego obiektu:Wszystkie powyższe metody z wdziękiem obsługują nakładające się nazwy członków z oryginalnych archiwów.
W przeciwnym razie musiałbyś rozpakować do różnych katalogów i ponownie zapakować, aby uniknąć zastępowania nakładających się nazw członków:
źródło
ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M
. Tworzy to tymczasowe cienkielibaz.a
archiwum, a następnie konwertuje cienkie archiwum na normalne (aby można je było przenosić / dystrybuować). To również z wdziękiem radzi sobie, gdy nazwy twoich bibliotek zawierają znaki specjalne (spacje, plusy lub przecinki) (tjar cqT libbundle.a libfoo++.a 'libbar baz.a'
.). Ale +1 ode mnie!libtool
, otrzymuję następujące błędy:libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag'
Jakieś pomysły, jak to naprawić?--Wl,-whole-archive
opcja jest wymagana w oryginalnym poleceniu łączenia dla wielu bibliotek * .a i muszę połączyć wszystkie biblioteki lib * .a wone.a
. Podczas ponownego łączenia--Wl,-whole-archive
nie będzie działać zone.a
. Co sugerujesz? stackoverflow.com/questions/56323197/…Jeśli po prostu zrobisz to jako:
utracisz niektóre pliki obiektowe, jeśli istnieją członkowie o tej samej nazwie zarówno w aa, jak i ba, więc musisz rozpakować członków różnych archiwów do innego folderu:
Co więcej, możliwe jest, że w jednym archiwum jest wielu członków o tej samej nazwie (powiedzmy w aa), jeśli uruchomisz ar x aa , otrzymasz tylko jednego dla tych członków o tej samej nazwie.
Jedynym sposobem wyodrębnienia wszystkich członków o tej samej nazwie w jednym archiwum jest określenie numeru członka za pomocą opcji „N”:
byłaby to żmudna praca, więc będziesz musiał napisać bardziej wyrafinowany skrypt, aby wykonać tę pracę.
Jednym z opcjonalnych rozwiązań jest połączenie wielu archiwów w jedną wspólną bibliotekę:
w ten sposób konsolidator zajmie się wszystkim za Ciebie!
źródło
-fPIC
.Jeszcze lepiej wykonujesz częściowe łączenie w każdej bibliotece i utworzysz archiwum dwóch wynikowych plików obiektowych. W ten sposób działa jak biblioteki współdzielone
Robisz częściowe linkowanie z
więc zamiast tworzyć archiwum pośrednie lub po jego ponownym rozpakowaniu, uruchom
następnie
źródło
teraz masz dwie wersje „macroblock-10.o”
źródło
Tutaj tworzysz archiwum archiwów, a następnie „spłaszczasz” (przerzedzasz) wynik za pomocą flagi T. Nie jestem pewien, jak to będzie działać z plikami o tej samej nazwie, które mogą być w nich zawarte.
źródło