Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Logik 12. 04. 2013, 18:42:58

Název: Extrakce z archivu (statické knihovny)
Přispěvatel: Logik 12. 04. 2013, 18:42:58
Ahoj,
mam problém - mám statickou knihovnu (konkrétně metis), a potřebuji tuto knihovnu sloučit s jinou.
Šel jsem na to klasickou cestou - vyextrahovat obj soubory a:
ar x libmetis.a
ar x druháknivona
a vytvořit novou knihovnu:
ar rc novaknihovna *.o

Jenže v libmetis.a jsou dva soubory utils.c.o (každý s jiným obsahem). Při extrakci tak druhý přepíše první
a tak je výsledná knihovna nekompletní.

Takže otázka: nevíte jak buďto
a) sloučit dvě statické knihovny, aniž by se z nich musely extrahovat obj soubory
nebo
b) jak vyextrahovat z archivu všechny obj soubory, i když tam jsou dva se stejným jménem
a jiným obsahem
nebo
c) nějaké jiné řešení tédle situace? :-)

Název: Re:Extrakce z archivu (statické knihovny)
Přispěvatel: Logik 13. 04. 2013, 15:58:57
Nikdo nic? :-) To sem to napsal tak nepochopitelně, nebo je to fakt neřešitelný?
Název: Re:Extrakce z archivu (statické knihovny)
Přispěvatel: monitor 14. 04. 2013, 21:20:08
No, riesenie by mohlo byt:
1. vyextrahuj tie *.o subory z prveho *.a,
2. premenuj ten utils.o na utils1.o, alebo hocijake ine meno (napr. utils.libmetis.o)
3. vyextrahuj tie *.o subory z druheho *.a,
4. vytvor novy archive a tresni do neho vsetky tie *.o

...

ako sa hovori,

5. PROFITuj z toho :-)

Pri linkovani (ak je obsah tych utils.o a utils.o naozaj rozny, a nebiju sa)
by nemal byt dolezity nazov *.o suborov (vnutri tvojich *.a), ale ich obsah

Název: Re:Extrakce z archivu (statické knihovny)
Přispěvatel: monitor 14. 04. 2013, 21:35:13
Aha, a este odpoved na Tvoju otazku: "a) sloučit dvě statické knihovny, aniž by se z nich musely extrahovat obj soubory
nebo"

1.
ak rozumies Makefile-om, tak napriklad, ak tie dva archivy sa robia v jednom Makefile-i,
tak mozes si urobit novy target, kde vytvoris ten treti archiv z tych *.o suborov, z ktorych sa vytvorili tie predchadzajuce dva *.a

2.
Inak, davam do pozornosti "option" pre ar s pismenkom T : (skus pouzit  pre ten novy, treti archive)

" Make the specified archive a thin archive.  If it already exists and is a regular archive, the existing members must be present in the same directory as
           archive.
"

"       GNU ar can optionally create a thin archive, which contains a symbol index and references to the original copies of the member files of the archives.  Such
       an archive is useful for building libraries for use within a local build, where the relocatable objects are expected to remain available, and copying the
       contents of each object would only waste time and space.  Thin archives are also flattened, so that adding one or more archives to a thin archive will add
       the elements of the nested archive individually.  The paths to the elements of the archive are stored relative to the archive itself.
"
Název: Re:Extrakce z archivu (statické knihovny)
Přispěvatel: Logik 15. 04. 2013, 12:56:31
Jenže on je problém, že ten soubor utils.o je dvakrát v JEDNÉ knihovně. Takže já ten první vůbec neumím vyextrahovat, protože na příkaz
ar x libmetis.a utils.o
(nebo jak to je přesně, píšu z hlavy) se vždy vyextrahuje pouze ten druhý utils.o

Šahat do makefilů, kde se dělat ty původní soubory můžu, ale vzhledem k tomu, že to jsou third party knihovny a já stavim něco nad tim, tak to nechci. Už proto, že ty cizí knihovny pravděpodobně nemůžu distribuovat atd....

Zatím, co jsem vymyslel, je udělat z těch dvou statickejch knihoven sdílenou knihovnu, ale to taky není ideální řešení...
Název: Re:Extrakce z archivu (statické knihovny)
Přispěvatel: monitor 15. 04. 2013, 22:52:16
Ospravedlnujem sa za nepozorne citanie...

navrhujem teda skusit toto:

1. rozbalit libmetis.a
ar x libmetis.a

1.5 pre istotu zmazat utils.c.o
rm utils.c.o

2. explicitne rozbalit PRVY vyskyt utils.c.o
ar xN 1 libmetis.a  utils.c.o

3. a hned aj premenovat utils.c.o na utils.c.1.o
mv utils.c.o utils.c.1.o

4. explicitne rozbalit DRUHY vyskyt utils.c.o
ar xN 2 libmetis.a  utils.c.o

5. skusit tie dalsie planovane kroky, akokeby sa nechumelilo (dnes teda u nas nie :-)
ar x druháknihovna.a
a vytvořit novou knihovnu:
ar rc novaknihovna *.o


Zdroj: man ar
"       N   Uses the count parameter.  This is used if there are multiple entries in the archive with the same name.  Extract or delete instance count of the given
           name from the archive."

(ak to nahodou nepojde, ako vyzera vystup:
ar tv libmetis.a

a co vidno pre tie subory utils.c.o
nm -s libmetis.a?)

Vela stastia (s particiami grafov?)