2012-11-12 13 views
5

Próbuję zbudować małą aplikację GUI Qt (C++) na Linuksie, ale nie kompiluje się z licznymi błędami linkera, narzekając na brakujące zależności dla biblioteki Qt, z którą łączę. Użyłem ldd na bibliotekach Qt, aby sprawdzić, czy biblioteki rzeczywiście istnieją - i są.Jak automatycznie łączyć się z zależnościami biblioteki współdzielonej

Mój problem wydaje się być związany z dyskusji w tym wątku: Linking dependencies of a shared library I choć ten wątek pomógł mi zidentyfikować moją dokładną problemu, wydaje się, że zawarcie tego wątku było to, że moja aplikacja powinna połączyć!

Aplikacja jest przygotowana z następujących poleceń:

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

Działanie tego generuje ostrzeżenia o następującej formie, a linkami ostatecznie nie z niezdefiniowanych błędów odniesienia (symboli zdefiniowanych w „brakujących” bibliotek)

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

i tak dalej (w sumie jest 18 zależności, które nie mogły zostać znalezione.)

mogę tego skompilować gdybym idź i jawnie dodaj -lglib, -lpng14, -lz -lfreetype i tak dalej, ale jak już wspomniałem, istnieje 18 zależności - i wolałbym tego nie robić. Wydaje się również, że nie powinienem tego robić.

Mam skompilowany ten sam projekt na moim laptopie, który używa dokładnie tego samego Linux Distro (openSuse 12.2) bez żadnych problemów. Wszystkie biblioteki, w tym Qt, zostały zainstalowane z repozytoriów.

Myślę, że to może być jakiś problem z instalacją na mojej instalacji openSuse, ale nie mam pojęcia, od czego zacząć to naprawić.

Cheers, Craig

+0

Zgadzam się, że powinien on działać bez konieczności dodać wszystkie biblioteki zależne. Podejrzewam coś w rodzaju błędnej konfiguracji systemu. Być może ponowne zainstalowanie części toolchain, takich jak kompilator i binutils, może pomóc ...? –

+0

Używając Yast usunąłem binutils, a następnie ponownie zainstalowałem narzędzia gcc i teraz to działa. Dzięki za odpowiedź. –

Odpowiedz

1

Wydaje się, że /usr/lib64/libQtGui.so szuają rpaths w nich zlokalizować zależnych bibliotek współdzielonych. Na jednym z hostów potrzebne biblioteki znajdują się w oczekiwanym miejscu, podczas gdy na innym hostelu nie są.

Możesz użyć czegoś takiego jak elfdump, aby uzyskać RPATH z biblioteki współdzielonej QT, aby dowiedzieć się, gdzie będzie wyglądał. Następnie możesz użyć (jak sądzę) -R w wierszu poleceń linku, aby wskazać, gdzie biblioteki są faktycznie zainstalowane na tym hoście.

EDIT: Myślę, że można zrobić coś takiego objdump -x <binary/library> | grep -i rpath

+0

Idąc za sugestiami Jamey powyżej, naprawiłem rzeczy dla mnie, ale jako odpowiedź na twoją odpowiedź. openSuse nie pochodzi z elfdump. Każdy pomysł, jak znaleźć RPATH osadzony w pliku elfa w tym systemie. Próbowałem objdump i readelf, i znalazłem odniesienia do bibliotek w ich wynikach, ale nic o RPATH. –

+0

Używam do tego 'chrpath'. W Debianie nie jest to niespodzianką w pakiecie 'chrpath'. :-) Wyobrażam sobie, że 'objdump' też by działało, ale jeśli nie ma ścieżki rpath w pliku binarnym, po prostu nie zobaczysz żadnego wyjścia, więc ciężko jest stwierdzić, czy działa bez znalezienia binarnego pliku obciążającego rpath, aby go przetestować. –

Powiązane problemy