2010-09-29 15 views
63

arasına ekleme ar cr, libabc.a ve libxyz.a tarafından oluşturulan 2 statik linux kitaplığım var.
Tek bir statik kitaplığa libaz.a birleştirmek istiyorum.
Bunu nasıl yapabilirim?İki "ar" statik kütüphaneyi bir

Ben, birleştirilmiş statik kütüphane oluşturmak için her iki .a dosyalarından nesneyi ayıklamak ve çıkarılan .o s kullanarak .a dosyası oluşturabilirsiniz

+6

Ayrıca bakınız: [ 'libtool' bazlı solüsyon] (http: // stackoverflow. com/a/8170851/196561): 'libtool -static -o new.a old1.a old2.a' – osgx

+1

, bu kütüphaneler ortak dosyalara sahipse, sadece küçük bir şüphe ile çalışır. Hala işe yarayacak mı? – bindingofisaac

cevap

39

uygulamaların son halkası, her iki kütüphanenin vermek istemesen:

ar -x libabc.a 
ar -x libxyz.a 
ar -c libaz.a *.o 
+41

Tehlike, Will Robinson! Bu, libabc.a ve libxyz.a'daki üyelerin adları çakışmıyorsa _only_ çalışır. Aksi takdirde bir tanesinin üzerine yazılır ve kaybolur. –

+5

Ayrıca, 'libabc.a' aynı ada sahip nesnelere sahip olabilir (farklı dizinler kaynaklı) - yeniden birleştirme işe yaramaz! –

+6

'ar -c' benim için çalışmadı (Ubuntu 14.04). Ardım: İşlem yok ”. Onun yerine -qc' yaptım ve bu iyi çalıştı. – Max

6

sadece olarak yaparsanız:

ar x a.a 
ar x b.a 
ar c c.a *.o 

t eğer bazı nesne dosyalarını kayıp olacaktır Burada hem aa ve ba böylece aynı adla üyeleridir, farklı bir klasöre farklı arşivlerde üyelerini ayıklamak gerekir:

ayrıca daha
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 

, aynı adı taşıyan birden fazla üye bir arşivde olduğu posible (aa diyelim), eğer ar x aa'u çalıştırırsanız, aynı ada sahip üyeler için yalnızca bir tane alacaksınız. Eğer bir yazmak zorunda böylece

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 
... 

bu, sıkıcı bir iş olurdu:

bir arşivde aynı adı tüm üyelerini ayıklamak için tek yol seçeneği 'N' ile üye sayısını belirtmektir Bu işi yapmak için daha karmaşık betik.

Bir opsiyonel çözümleri tek bir paylaşılan kitaplığa birden fazla arşiv birleştirebilirsiniz şudur:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

bu şekilde bağlayıcı sizin için her şeyi idare edecek!

+1

Samuel, teşekkürler. Ancak paylaşılan kütüphaneye dahil olarak, tüm nesneler '-fPIC' ile derlenmelidir. – osgx

72

Bunu yapmak için en az üç yolu yerel olarak. İlk ve en taşınabilir yol libtool kullanmaktır.

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la 

diğer iki en azından kullanılabilir: Ayrıca libtool'un ile diğer kütüphaneler inşa ettikten sonra, böyle bir şey ile bir Makefile'dan doğrudan sadece bir automake libaz_la_LIBADD değişkene .la kütüphanelerini ekleyerek bunları birleştirmek, ya da GNU ar kullanırken Bir MRI betiğini kullanabilirsiniz (örneğin libaz olarak adlandırılır).gibi MRI),: o zaman

create libaz.a 
addlib libabc.a 
addlib libxyz.a 
save 
end 

ve yürütme ar olarak:

ar -M <libaz.mri 

Yoksa onları iç içe almadan diğer arşivleri ekleyerek sağlayacak bir ince arşivi (opsiyon -T) kullanabilir Eğer statik kütüphane dağıtmak istiyorsanız içeride, olumsuz olmasına rağmen, müstakil nesne eksik olacağını:

ar -rcT libaz.a libabc.a libxyz.a 

Yukarıdaki tüm yöntemler, orijinal arşivlerden çakışan üye adlarını zarif bir şekilde ele alır.

Aksi takdirde, örtüşen üye adlarını değiştirerek önlemek için, farklı dizinlere içine açmak ve yeniden paketleyin olurdu:

mkdir abc; cd abc; ar -x ../libabc.a 
mkdir xyz; cd xyz; ar -x ../libxyz.a 
ar -qc libaz.a abc xyz 
+8

Normal bir arşiv (ince olmayan) isteyenler için, yapılabilecek basit bir şey ince bir arşiv oluşturmak, ardından onu normal bir arşive dönüştürmektir. Şöyle bir şey: 'ar cqT libaz.a libabc.a libxyz.a && echo -e 'libaz.a \ naddlib oluşturmak libaz.a \ nsave \ nend' | ar -M Bu, geçici bir ince libaz.a oluşturur ve ince arşivi normal olana dönüştürür (böylece taşıyabilir/dağıtabilirsiniz). Bu, kütüphane adlarınız özel karakterlere (boşluklu, artı veya virgül) sahip olduğunda da zarif bir şekilde işlenir (yani, arbq libbundle.a libfoo ++. A 'libbar baz.a'). Ama benden +1! – Cornstalks

+0

Verilen ilk MRI komut dosyasının olumsuz tarafı nedir? MRI komut dosyası için –

+0

+ 1! – scraimer