2012-11-12 18 views
5

Linux'ta küçük bir Qt (C++) GUI uygulaması oluşturmaya çalışıyorum ancak bağlantı kurabilen Qt kitaplığı için eksik bağımlılıklar hakkında şikayette bulunarak sayısız bağlantı hatalarıyla yapılamıyor. Kütüphanelerin gerçekten orada olduğunu doğrulamak için Qt kütüphanelerinde ldd kullandım - ve onlar. Linking dependencies of a shared library Ve bu iş parçacığı benim hassas sorunları belirlemek yardım ederken, o dişin sonuca başvurum bağlamalıdır olmasıydı görünüyor:Paylaşılan kitaplığın bağımlılıkları otomatik olarak nasıl bağlanır

Benim sorunum bu thread tartışma ile alakalı gibi görünüyor!

uygulama şu komutla derlenmektedir:

g++ -m64 -Wl,-O1 -o Executable some-object.o some-other-object.o -lQtCore -lQtGui -lQtXml -L/usr/lib64 -L/usr/X11R6/lib64 -lpthread 

bu aşağıdaki biçimde uyarılar üretir Koşu ve bağlama sonunda ('kayıp' kütüphanelerde belirlenen sembollere) tanımlanmamış referans hataları ile başarısız:

.../ld: warning: libglib-2.0.so.0, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libpng14.so.14, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libz.so.1, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libfreetype.so.6, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 

vb (toplam bulunamadı 18 bağımlılıkları vardır.) Ben eğer alabilirim

bu derlemek için

Git ve açıkça -lglib, -lpng14, -lz -lfreetype ve benzeri ekledim, ama bahsettiğim gibi 18 bağımlılık var - ve bunu yapmamayı tercih ederim. Aynı zamanda yapmak zorunda olmamak gibi görünüyor.

Aynı projeyi, aynı Linux Distro'yu (openSuse 12.2) kullanan herhangi bir sorun olmadan dizüstü bilgisayarımda derledim. Qt dahil tüm kütüphaneler dağıtım havuzlarından kuruldu.

Bu, openSuse kurulumumda bir tür kurulum sorunu olabileceğini düşünüyorum, ancak bunu düzeltmek için nereye bakacağım konusunda hiçbir fikrim yok.

Alkış, Craig

+0

gibi bir şey yapabiliriz. Bir çeşit sistemin yanlış yapılandırılmasından şüphelenirim. Belki de derleyici ve binutils gibi araç zincirinin yeniden yüklenmesi yardımcı olabilir ...? –

+0

Yast Kullanımı'nı kullanarak binutils'i kaldırdıktan sonra gcc araçlarını yeniden yükledim ve şimdi çalışıyor. Cevabın için teşekkürler. –

cevap

1

O /usr/lib64/libQtGui.so bağımlı paylaşılan kütüphaneleri bulmak için onları rpaths kodlanmış anlaşılıyor. Ev sahiplerinizden birinde, gerekli olan kütüphaneler, diğer ana bilgisayarda değil, beklenen konumdadır.

Elfdump gibi bir şey kullanıp nereye bakacağını öğrenmek için RPATH QT paylaşılan kitaplığından yararlanabilirsiniz. Ardından, kütüphane gerçekte bu ana bilgisayara yüklendiğine işaret etmek için bağlantı komut satırında (inanıyorum) -R'u kullanabilirsiniz.

DÜZENLEME: Sana bu sadece tüm bağımlı kitaplıkları eklemek zorunda kalmadan çalışın gerektiğini kabul ediyoruz objdump -x <binary/library> | grep -i rpath

+0

Jamey'in önerilerini, benim için sabit şeylerin üstünde, fakat cevabınızı takip etmenin ardından. openSuse elfdump ile birlikte gelmiyor. Bu sistemdeki bir elf dosyasına gömülü RPATH'yi nasıl bulacağımı biliyorsunuz. Ben objdump ve kendini denedim, ve onların çıktılarında kütüphanelere referanslar buldum, ama bir RPATH hakkında hiçbir şey. –

+0

Bunun için 'chrpath' kullanıyorum. Debian'da, 'chrpath' paketinde, şaşırtıcı bir şekilde. :-) Ben de objdump'ın çalışacağını hayal ediyorum, ama eğer ikilide bir rpath yoksa, sadece herhangi bir çıktı göremezsiniz, bu yüzden de test etmek için rpath-encumbered bir ikili bulmadan çalışıp çalışmadığını söylemek zor. –

İlgili konular