2012-11-22 20 views
22

Ben linke sırasında aşağıdaki uyarı:kurtulun "gcc -/usr/bin/ld: uyarı lib bulunamadı"

/usr/bin/ld: warning: libxxx.so.6, needed by /a/b/c/libyyy.so, not found (try using -rpath or -rpath-link) 

uyarı ortam değişkeni LD_LIBRARY_PATH = path_to_libxxx.so.6 sessizliği Ayarlama (-Lpath_to_libxxx.so.6 eklenmesi yardımcı olmaz).

Sonuçta ortaya çıkan ikili yalnızca derleme olan ayrı bir derleme sunucum var. İkili diğer sunucuda çalıştırılır ve orada libxxx.so.6 ikili tarafından görülür (ldd executable ile kontrol edilir).

Derleme zamanında uyarıdan kurtulmanın başka bir yolu var mı (birkaç kez var ve çok can sıkıcıyım)?

+0

Lütfen sorunuzu açıklığa kavuşturun. Programı derlerken ve bağladığınızda ve onu çalıştırmayı denediğinizde ne olur? –

+0

@NikosC. – dimba

cevap

30

Sen -L dinamik kütüphane eşdeğer eklemeniz gerekir.

program çalışma zamanında de bu konumda de kütüphaneyi bulmak istiyorsanız, o zaman yapmak için bir seçenek var ki:

-Wl,-rpath,/path/to/lib 

Fakat, programınız o zaman bu olmadan size ince çalışıyorsa gerek yok

4

Gerekli kitaplıkların yollarının çalışma zamanı bağlayıcısı tarafından bilindiğinden emin olun. Bu, /etc/ld.so.conf.d/ içinde gerekli yolla bir dosya ekleyerek yapılır. Örneğin, aşağıdaki içeriği ile /etc/ld.so.conf.d/foo: Eğer çok eski bir Linux sürümü varsa

/usr/local/lib/foo/ 

, /etc/ld.so.conf.d/ olmayabilir desteklenir, bu durumda yolları doğrudan /etc/ld.so.conf dosyasına eklemeniz gerekebilir.

Bunu yaptıktan sonra, "ldconfig" komutunu çalıştırarak linker veritabanını güncellemeniz gerekir.

+0

numaralı soruda açıklanmıştır. Derlemenin yapıldığı sunucuda root izni yok. Sunucu derleme için * sadece * ve ikili de bunun üzerinde çalıştırılamaz. 1. soru, çalışma zamanı ortamına dikkat etmem gereken * bağlantı * zamanında neden ve 2. birimin uyarıdan nasıl kurtulduğudur. – dimba

+1

@dimba Ona dikkat etmek zorunda değilsin. Bu sadece, ikili makinenin geçerli makinede çalışmayacağını bildiren bir uyarıdır. Bağlama sırasında bir rpath kullanılmadan uyarının nasıl devre dışı bırakılacağı konusunda bilmiyorum. (Bir rpath kullanmak, kitaplıklarınızı yürütülebilir dosyalarla birleştirmediğiniz sürece genellikle iyi bir fikir değildir.) Kök izniniz yoksa, LD_LIBRARY_PATH tek seçeneğinizdir. –

0

Komut satırı seçeneklerini kullanarak bu uyarıyı susturmanın tek yolu, sizin için ilginç bir şekilde çalışmayan -L bayrağı olacaktır (belki daha fazla ayrıntıyı bu sayfada yayınlayabilirsiniz). Uyarı ld tarafından üretildiğinden, bir bağlayıcı uyarısını devre dışı bırakmak için -Wl,option kullanmayı deneyebiliriz, ancak documentation of GNU ld'dan bu uyarıları etkinleştirme (de) seçeneği yoktur.

Bu, bizi bu uyarıyı filtreleyen bir sarıcı komut dosyası yazarak veya ld özel bir sürümünü derleyerek bırakıyor.

-Wl,-rpath-link,/path/to/lib 

Bu bağlayıcı standart dışı yerlerde paylaşılan kütüphaneler aramaya neden olur, ancak yalnızca bağlantıyı doğrulamak amacıyla doğrudur:

-1
Bu eski olduğunu biliyorum

ama here's a better fix:

kök neden:

GCC tarafından çağrılan LD kütüphane bağımlılıklarını çözmek başladığında sorun aslında olmuyor. Hem GCC hem de LD, kütüphaneleri içeren sysroot 'un farkındadır, ancak LD bir kritik bileşenini eksik olabilir: /etc/ld.so.conf dosyası. İşte bir exampleld.so.

dahil /etc/ld.so.conf.d dizini şu dosyaları içerir

/etc/ld.so.conf.d/*.conf: Bir Ahududu PI sisteminden conf dosyası

00-vmcs.conf: /opt/vc/lib

kol linux-gnueabihf.conf:

/lib/kol-linux-gnueabihf/usr/lib/kol-linux-gnueabihf

libc.conf:

/usr/evrensel

lib/yerel çözelti

sorun kolayca LD yapılandırma fi kopyalayarak çözülebilir çapraz araç zincirinin LD'sinin bulabileceği bir yere numaralı telefonu ekleyin. Ancak, tek bir tuzak var: eğer çapraz alet zinciriniz MinGW ile oluşturulmuşsa (muhtemelen çoğu) glob() işlevine erişemediğinden, joker karakterli bir ifade deyimini ayrıştıramazsınız gibi * .conf. Burada geçici çözüm sadece elle

*/opt /etc/ld.so.conf içine /etc/ld.so.conf.d tüm .conf dosyalarının içeriğini birleştirmek ve onları yapıştırın/lib vc/

/lib/kol-linux-gnueabihf

/usr/lib/kol-linux-gnueabihf

/usr/lib/yerel * Eğer ld oluşturduktan sonra

. th içinde so.conf dosyası e doğru klasör, sizin toolchain otomatik olarak tüm paylaşılan kütüphane referansları çözmek mümkün olacak ve bu hata mesajı tekrar görmeyeceksiniz!

İlgili konular