2011-07-09 26 views
25

Başka bir uygulama tarafından kullanılan ve * .so nesneleri gerektiren başka bir uygulama tarafından kullanılan paylaşılan bir kitaplığım var. Kitaplığım, statik olarak bağlantılı olması gereken sqlite3'ü kullanır (kesinlikle kendi kendine yeten bir ikiliye ihtiyacım var).C++ Statik olarak bağlantılı paylaşılan kitaplık

ben derlemek ve Kitaplığımı bağlamak deneyin:

-fpic -flto -pthread -m64 
-flto -static -shared 

aşağıdaki hata ile sona:

/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC 
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value 
collect2: ld returned 1 exit status 

Ne -fpic ile yeniden derleme ile ilgilidir? Benim kodum veya CRT mi?

Nesnemi aynı sonuçla -fPIC ile derlemeye çalıştım.

Teşekkürler.

DÜZENLEME:

sorun SQLite3 ile ilişkili görünmemektedir.

g++ -c -fPIC -o bar.o bar.cpp 
g++ -shared -o bar.so bar.o 

ancak bu gibi:

g++ -c -fPIC -o bar.o bar.cpp 
g++ -static -shared -o bar.so bar.o 

sorun CRT ile ilişkili olduğu görünmektedir

ben derler ve bunun gibi bağlantıları basit tek satırlık-do-nothing kütüphanesini yazdığı (crtbeginT.o). GCC'yi yeniden yazmam mı gerekiyor?

+0

Bu biraz kafa karıştırıcı. Kitaplığınızı statik bir sqlite kitaplığına bağlamaya mı çalışıyorsunuz yoksa başka bir şey yapmaya mı çalışıyorsunuz? – nos

+0

PIC = Konum Paylaşılan lib'ler için gerekli Bağımsız Kod (çoğu mimaride, sanırım) – sehe

+0

@nos Paylaşılan kitaplığımı sqlite3.a ile bağlamaya çalışıyorum – Petr

cevap

35

Sen -static bayrağı kullanmamalısınız, bu statik bağlantılı yürütülebilir oluşturmak için.

Kitaplığın yalnızca statik bir sürümü varsa, onu kullanarak bağlayabilirsiniz. Ancak hem dinamik bir sürüm (.so) hem de statik bir sürüm varsa, bağlayıcı dinamik olanı tercih edecektir.

Bağlayıcıyı statik olanı almaya yönlendirmek için, bağlayıcıya -Bstatic bayrağını verin ve -Bdynamic ile diğer öğeler için (libc ve dinamik çalışma zamanı desteği gibi) dinamik bağlantıya geri dönün. Yani bayraklar kullanabilir, geçerli:

-Wl,-Bstatic -lsqlite3 -Wl,-Bdynamic 

Alternativly, sadece .a dosyası, örneğin tam yolunu belirtebilirsiniz Herhangi bir derleyici/linker bayrağı yerine /usr/lib/libsqlite3.a.

GNU ld ile, yerine -l:libsqlite3.a'u da kullanabilirsiniz. Bu, bağlayıcı varsayılan olarak tercih edilen libsqlite3.so yerine libsqlite3.a kitaplık dosyasının kullanımını zorlayacaktır.

.a dosyasının -fpic bayrağından derlenmiş olduğundan emin olun, aksi halde normal olarak paylaşılan bir kitaplığa gömemezsiniz.

+0

Burada aynı sorun var ve libc/libstdC++ - '-Bstatic gibi dinamik olarak bağlantılı paylaşılan kütüphane gibi dağıtım bağımlı personele dinamik olarak bağlanmayan paylaşılan kütüphaneyi nasıl derleyeceğimi bilmiyorum. Harika, Windows üzerinde MinGW kullanarak .dll -dll ile düzgün bağlayabilirsiniz (sadece windows dlls'e bağlı değil ama mww'nin değil). Bağlantının bir yolu var mı? – Nick

+0

No. unix paylaşılan kütüphaneler, windows dlls'den çok farklı çalışır. – nos

+0

The -l: libsqlite3.a hilesi eclipse cdt'de de çalışır. Enter: libsqlite3.a Özellikler-> C/C++ Yapı-> Ayarlar-> GCC C Bağlayıcı-> Kütüphaneler ve yapı kütüphaneye karşı statik olarak bağlanır. – zztops

7

Bir şekilde dinamik bir kitaplığa dönüşecek herhangi bir kodun yeniden yüklenebilir olması gerekir. Bu, statik veya dinamik olarak önemli olan .so ile bağlantılı olan her şeyin -fPIC ile derlenmesi gerektiği anlamına gelir. Spesifik olarak, statik sqlite kütüphanesi de -fPIC ile derlenmelidir. Ne PIC araçlarının

Detaylar burada: Paylaşılan kitaplık oluştururken http://en.wikipedia.org/wiki/Position-independent_code

+0

Ben sqlite3 --with-pic yeniden derlenmiş ama sonuç hala aynıdır ... – Petr

+0

Yaptığınız tam bağlantı komutlarını gönderin böylece daha fazla analiz edebiliriz) – vines

+0

Özgün gönderiye bakın. – Petr

0

Aynı problem vardı. Görünüşe göre -statik -Bstatic ile aynı değildir. -Statik'e geçtim ve her şey işe yaradı.