Existují nejméně tři způsoby, jak to provést nativní . První a nejpřenosnější způsob je použití libtool. Po vytvoření ostatních knihoven také pomocí libtool je můžete zkombinovat pouhým přidáním .la libs do proměnné automake libaz_la_LIBADD nebo přímo z Makefile s něčím jako:
libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
Další dva jsou alespoň dostupné při použití GNU ar. Můžete použít skript MRI (pojmenovaný například libaz.mri), například:
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end
a poté spusťte ar jako:
ar -M <libaz.mri
Nebo můžete použít tenký archiv (volba -T
), což umožní přidávat další archivy, aniž by byly vnořeny dovnitř, i když nevýhodou je, že pokud chcete distribuovat statickou knihovnu, odpojený objekt bude chybět:
ar -rcT libaz.a libabc.a libxyz.a
Všechny výše uvedené metody elegantně zvládají překrývající se jména členů z původních archivů.
V opačném případě byste se museli rozbalit do různých adresářů a znovu zabalit, abyste se vyhnuli nahrazení překrývajících se jmen členů:
mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz
Pokud to jednoduše uděláte jako :
ar x a.a
ar x b.a
ar c c.a *.o
ztratíte některé soubory objektů, pokud jsou členové se stejným jménem v a.a i b.aso, musíte rozbalit členy různých archivů do jiné složky:
ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o
dále je možné, že v jednom archivu je více členů stejného jména (řekněme v a.a), pokud spustíte ar x a.a , získáte pouze jeden pro členy se stejným jménem.
Jediný způsob, jak extrahovat všechny členy se stejným jménem v jednom archivu, je zadat číslo člena pomocí možnosti 'N':
ar xN 1 a.a xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a xxx.c.o && mv xxx.c.o xxx.c.2.o
...
byla by to únavná práce, takže budete muset napsat propracovanější scénář, abyste tuto práci zvládli.
Jeden volitelný řešení spočívá v tom, že můžete spojit více archivů do jedné sdílené knihovny:
g++ -shared -o c.so -Wl,--whole-archive a.a b.a
tímto způsobem linker vyřídí všechny věci za vás!
Objekt můžete extrahovat z obou .a
a vytvořte si .a
pomocí extrahovaného .o
s:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
Ještě lépe provedete částečné propojení na každé knihovně a vytvoří archiv ze dvou výsledných objektových souborů. Tímto způsobem to funguje jako sdílené knihovny
Částečné propojení provedete pomocí
gcc -r --nostdlib
takže buď místo vytvoření přechodného archivu nebo jeho opětovného rozbalení spusťte
gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o
pak
ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o