Kompilacja na 32 bit, uruchomienie na 64 bit i 32 bit

0

Napisałem program w C++/Qt, korzystałem z QtCreatora. Pisałem i kompilowałem na Xubuntu 13.04. Teraz chciałbym uruchomić swój program np. na Kubuntu 13.04 64 bit albo na Mincie 15 32 bit. Gdy próbuję uruchomić skompilowany program na innym systemie, mam taki komunikat:

./app error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory

Co mogę zrobić, żeby mój program był "przenośny" między tymi linuksami? (+ różnobitowymi ich wersjami)

1
  • Zainstalować pakiet z tą biblioteką lub
  • Dołączyć potrzebne biblioteki z programem lub
  • Zbudować program ze statycznym dołączaniem bibliotek

http://qt-project.org/doc/qt-5.0/qtdoc/deployment.html

0

A więc tak. Poczytałem trochę i zrobiłem coś takiego:

  1. Na maszynie, OS 32 bit na której kompilowałem, dałem polecenie:

ldd ./app

  1. Pokazało mi:

linux-gate.so.1 => (0xb7775000)
libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0xb75b0000)
libQt5Widgets.so.5 => /usr/lib/i386-linux-gnu/libQt5Widgets.so.5 (0xb6fa2000)
libQt5Gui.so.5 => /usr/lib/i386-linux-gnu/libQt5Gui.so.5 (0xb6bc3000)
libQt5Core.so.5 => /usr/lib/i386-linux-gnu/libQt5Core.so.5 (0xb6790000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb66a7000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6664000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6647000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6493000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb648e000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6475000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb645a000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb640a000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb6308000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb61d1000)
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb61a8000)
libGL.so.1 => /usr/lib/i386-linux-gnu/mesa/libGL.so.1 (0xb614f000)
libicui18n.so.48 => /usr/lib/i386-linux-gnu/libicui18n.so.48 (0xb5f7b000)
libicuuc.so.48 => /usr/lib/i386-linux-gnu/libicuuc.so.48 (0xb5e15000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb5e0c000)
/lib/ld-linux.so.2 (0xb7776000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb5e05000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb5dc4000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb5da2000)
libglapi.so.0 => /usr/lib/i386-linux-gnu/libglapi.so.0 (0xb5d8a000)
libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb5d78000)
libXdamage.so.1 => /usr/lib/i386-linux-gnu/libXdamage.so.1 (0xb5d74000)
libXfixes.so.3 => /usr/lib/i386-linux-gnu/libXfixes.so.3 (0xb5d6d000)
libX11-xcb.so.1 => /usr/lib/i386-linux-gnu/libX11-xcb.so.1 (0xb5d6a000)
libxcb-glx.so.0 => /usr/lib/i386-linux-gnu/libxcb-glx.so.0 (0xb5d51000)
libxcb-dri2.so.0 => /usr/lib/i386-linux-gnu/libxcb-dri2.so.0 (0xb5d4c000)
libXxf86vm.so.1 => /usr/lib/i386-linux-gnu/libXxf86vm.so.1 (0xb5d46000)
libdrm.so.2 => /usr/lib/i386-linux-gnu/libdrm.so.2 (0xb5d39000)
libicudata.so.48 => /usr/lib/i386-linux-gnu/libicudata.so.48 (0xb4bc8000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb4bc3000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb4bbc000)

3.Więc na 32 bitowym systemie poniższe skopiowałem pliki, i powstała mi taka hierarchia plików (którą będę chciał przenosić między systemami - może to mało, może trzeba skopiować wszystkie pokazane przez ldd?):

app4.png

w katalogu platforms mam tylko 1 plik, libxcb.so.1

  1. run.sh:
 #!/bin/sh
chmod u+x app
LD_LIBRARY_PATH=.
export LD_LIBRARY_PATH
./app
  1. Pokazuje mi:

Failed to load platform plugin "xcb". Available platforms are:

Aborted (core dumped)

Jakieś podpowiedzi? ;)

0

ldd odpal na maszynie docelowej by sprawdzić jakich bibliotek brakuje.

0

Ok, jednak skopiowałem z 32 bit OS wszystkie pliki, które mi pokazało ldd, teraz wygląda to tak:

app5.png

w platforms jest libqlinuxfb.so oraz libqxcb.so.

Teraz na 64 bit OS, w katalogu z aplikacją katalog . (bieżący):

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

oraz

ldd ./app
linux-gate.so.1 => (0xf77b4000)
libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0xf75e3000)
libQt5Widgets.so.5 (0xf6fd5000)
libQt5Gui.so.5 (0xf6bf6000)
libQt5Core.so.5 (0xf67c3000)
libstdc++.so.6 (0xf66da000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf6697000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf667a000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf64c6000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf64c1000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf64a8000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf648d000)
libgobject-2.0.so.0 (0xf643d000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xf633b000)
libX11.so.6 (0xf6204000)
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xf61db000)
libGL.so.1 => /usr/lib32/nvidia-310/libGL.so.1 (0xf60fb000)
libicui18n.so.48 (0xf5f27000)
libicuuc.so.48 (0xf5dc1000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf5db8000)
/lib/ld-linux.so.2 (0xf77b5000)
libffi.so.6 (0xf5db1000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xf5d70000)
libxcb.so.1 (0xf5d4d000)
libnvidia-tls.so.310.44 => /usr/lib32/nvidia-310/tls/libnvidia-tls.so.310.44 (0xf5d49000)
libnvidia-glcore.so.310.44 => /usr/lib32/nvidia-310/libnvidia-glcore.so.310.44 (0xf4027000)
libXext.so.6 (0xf4015000)
libicudata.so.48 (0xf2ea4000)
libXau.so.6 (0xf2e9f000)
libXdmcp.so.6 (0xf2e98000)

czyli jakby nic mu nie brakuje ... a wyświetla przy uruchomieniu:

Failed to load platform plugin "xcb". Available platforms are:
linuxfb
xcb

Przerwane (core dumped)

0

Wyszukaj hasło: Failed to load platform plugin "xcb". Available platforms are: w Google i sprawdź rozwiązania.

0

To była moja pierwsza myśl ... i niestety, nic nie pomogło, nie mogę utworzyć przenośnego "exe". Probowałem również ERMINE i ELF Statifier, jednak na maszynie, na któ¶ej tworzę binarkę działa, a przenosząc na inną maszynę (64 bit) już nie - błędy są różne - core dumped, seg fault.

Robiłeś już kiedyś coś takiego, mógłbyś podpowiedzieć?

0

Dystrybucja tego typu bibliotek współdzielonych (widzę masę bardziej lub mniej systemowych libów) z własnym programem nie jest dobre podejście. Albo zlinkuj swoją aplikację statycznie albo (jeszcze lepiej) dynamicznie i niech to użytkownicy się martwią o zależności. Nawet jeżeli chcesz uruchomić program 32-bitowy na 64-bitowym systemie to po to powstały takie pakiety jak ia32-libs na Debianie i Ubuntu. Możesz użytkownikowi pomóc, jeżeli sam stworzysz paczkę ze swoim programem i w niej wylisujesz swoje zależności (wtedy system sam najprawdopodobniej je spełni). Inaczej przypomina to bardziej czasy dll-hell z Windowsa 98.

1 użytkowników online, w tym zalogowanych: 0, gości: 1