GNU/Linux >> Znalost Linux >  >> Linux

Jak sloučit dvě statické knihovny do jedné?

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

Linux
  1. Jak sloučit 2 skupiny svazků (VG) do jedné pomocí vgmerge v LVM

  2. Sloučit / převést více souborů PDF do jednoho PDF

  3. Jak rozdělit jeden textový soubor do více souborů *.txt?

  1. [POKROČILÉ] Jak seskupit dva samostatné účty do jednoho účtu s doménou addonu

  2. Je možné nainstalovat dvě služby pro jeden balíček pomocí Dh_installinit? Jak?

  3. Sloučit dva soubory HTML do hlavního souboru HTML

  1. Jak sloučit více připojení k internetu do jednoho?

  2. Jak převést video ve vysoké kvalitě na video nízké kvality?

  3. Jak sloučit dva soubory pomocí AWK?