2010-04-15 27 views
26

dinamik kütüphaneye statik kütüphane nasıl bağlayabileceğiniz, ben statik .a (some_static_lib.a diyoruz) kütüphane derledik. Ben bağlamak istediğiniz başka bir dinamik kütüphaneye bu .a dosya inşa ediyorum (o libsomeDyn.so call) (sağ ifade yani?).gcc (g ++) altında gcc

/usr/bin/g ++ -fpic -g O2 -Wall -Werror kullanmamak -boru -march = Pentium3 -mtune: .so derler rağmen, ben nm komutunu kullanarak .so altında .a içeriğini görmüyorum = prescott -OS -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I ../../../../../../../../ -I ../../ .. /../../../../..//libraries -Wl, -rpath/usr/lib -o libsomeDyn.so some.o another.o some_static_lib.a -shared -Wl -x - Wl, -soname, libsomeDyn.so

01 altında some_static_lib.a altındaki işlevleri görmüyorum. Neyi yanlış yapıyorum? o bağlama gelince

cevap

33

Statik kütüphaneler özel kuralları vardır. Nesne çözülmemiş bir sembol sağlarsa, statik kitaplıktan bir nesne yalnızca ikiliye eklenecektir.

Linux'ta

, sen --whole-archive bağlayıcı seçeneği ile bu davranışı değiştirebilirsiniz:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive 
+0

Yani statik kitaplığında bazı garip bağımlılığı var. Dinamik kütüphanede yer alan bir işlevi referans alır. Gcc'e, dinamik kitaplıktaki tanımlanmamış referansı bulmasını nasıl söylerim? Teşekkürler – bob

+0

@bob - dinamik kitaplıktaki bir sembole başvuran statik kitaplıkta sorun olmamalıdır (bir statik kitaplığı bağladığınızda, komut satırında doğrudan .o ile aynıdır). Başka bir sorun olmalı ve yeni bir soru göndermenizi tavsiye ederim. –

+0

Bu benim için bir çözümdü, ancak OSX'te birisi IRC'de önerdiğim gibi '-whole-arşivi'ne '-all_load' eşdeğeri olarak kullanmak zorunda kaldım. Umarım başkasına yardım edebilir! – vmonteco

14

benim gibi böyle bir sorun rastlar (ve düzgün cevap anlamak değil) her biri için: Burada kısa bir howto olduğunu

1.) sadece mylib.h dosyasını

2.

) Bu MyLib derlemek ithal eden bir mylib.c dosyası oluşturmak: statik biri (mylib.a) bir dinamik kitaplık (libmylib.so) oluşturmak .c için

numaralı telefondan
gcc -c -fPIC mylib.c -o msat.o 

3.) aşağıdaki komutla dinamik kütüphane oluşturmak: dinamik bir kütüphane için -fpic ile derlenmiş statik kitaplığı() dönüm, benim için en az çalışmış

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 

. Bunun diğer kütüphaneler için işe yarayacağından emin değilim.

+2

, adım 2 "msat.o" yerine "mylib.o" demen gerekiyordu? – mwag

+0

Bunu test etmedim, ancak temel fikir muhtemelen iyi. Teknik olarak, --whole-arşivi bir linker seçeneğidir (gcc, "gcc --whole-arşivi" olarak geçerseniz bunu anlamayacaktır). Bunun yerine, örneğin "-Wl" öğesinin taşınması gerekir, örneğin: gcc -shared -Wl, - tüm-arşiv, -soname, libmylib.so ... Cevabı düzenlerdim, fakat eğer bunu test etmenin hiçbir yolu yok Eserleri. Geçerli formda, bir gcc hatasına yol açacaktır ("tanınmayan komut satırı seçeneği‘ - birleşik arşiv ""). –

+0

Ayrıca -Wl, - tüm arşiv ...-Wl, - tüm arşiv arşivi statik kütüphanenin etrafında olmalıdır (mylib.a). Kabul edilen cevapta olduğu gibi. –