2010-11-02 10 views
8

Napisałem mały program, który wymaga niektórych bibliotek, w tym libboost_filesystem, libboost_program_options i libcurl.Skompilowany program C++ podnosi "nie można otworzyć pliku współdzielonego obiektu" w innym systemie, chociaż plik jest obecny

Skompilowałem to na moim komputerze domowym i zabrałem plik binarny do mojego komputera w pracy, aby go tam przetestować. Ale nie daje następujący komunikat o błędzie podczas próby uruchomienia programu:

error while loading shared libraries: 
libboost_filesystem.so.1.42.0: cannot 
open shared object file 

ale kiedy szukać tego pliku widzę, że istnieje ona w: /usr/lib/libboost_filesystem.so.1.42.0

Czy coś nie tak podczas kompilacji/łączenia mojego programu? Jeśli tak, co mam zrobić, aby działało na innych urządzeniach?

+1

Często stwierdzam, że 'ldd' może mi pomóc dowiedzieć się, co jest nie tak. Co mówi "ldd./Your_executable"? –

+1

Z tego, co powiedziałeś, wygląda na to, że powinno działać. Może występować konflikt 32- lub 64-bitowy. Spróbuj uruchomić 'file./Your_executable' oraz' file/usr/lib/libboost_filesystem.so.1.42.0', aby sprawdzić, czy architektury się zgadzają :) –

+1

Wow masz rację. program zbudowany jest w wersji 32-bitowej, a obecna biblioteka to 64-bitowa wersja – tyrondis

Odpowiedz

1

Czy skompilowałeś udostępnione pliki binarne boost i dostarczyłeś je użytkownikowi?

Często można użyć boostu bez binarnego/udostępnionego do dostarczenia. Ale jeśli użyjesz, na przykład, boost :: filesystem, będziesz musiał skompilować pliki binarne, jako lib lub obiekt udostępniony, i upewnić się, że jest on dostępny dla końcowej, wykonywalnej ścieżki do binarnego wyszukiwania.

Możesz znaleźć wyjaśnienie i więcej szczegółów w dokumentacji doładowania. Oto wersja Linux: http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html

Od tej strony:

Większość bibliotek Boost są tylko nagłówek: składają się one całkowicie z plików nagłówkowych zawierające szablony i wbudowanych funkcji, i nie wymagają separately- skompilowane pliki binarne biblioteki lub specjalne traktowanie podczas łączenia.

...

Jedyne bibliotek Boost muszą być budowane oddzielnie są:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python (patrz Boost.Python budować dokumentację przed budynku i jego instalacji)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • impuls. System
  • Boost.Thread
  • Boost.Wave
+0

Czy mógłbyś wyjaśnić to z większą ilością szczegółów? Lub doprowadzić mnie do jakiegoś zasobu? Jestem dość nowy w rozwoju Linuksa i nie wiem zbyt wiele na ten temat. – tyrondis

+0

Dodaję link do dokładniejszej dokumentacji na ten temat. Gotowe. – Klaim

1

Wygląda na to, że musisz statycznie połączyć bibliotekę. Oto dobre wytłumaczenie.Boost static linking

+1

ok, ale jeśli połączę je statycznie, czy nie stracę korzyści wynikających z posiadania współdzielonych bibliotek? Pomyślałem, że byłoby „standardowy” sposób pod Linuksem – tyrondis

1

Czy linkowałeś z tą samą wersją biblioteki boost_filesystem? W zależności od sposobu kompilacji aplikacji, wymagana jest obecność tej samej wersji biblioteki.

można spróbować, aby sprawdzić, co aplikacja faktycznie wygląda na z:

ldd <your app name> 

Prawdopodobnie sprawdzić zmienną środowiskową LD_LIBRARY_PATH jak również.

+0

LLD dał mi \t libboost_filesystem.so.1.42.0 => Nie znaleziono \t libboost_program_options.so.1.42.0 => Nie znaleziono \t libboost_system.so.1.42. 0 => nie znaleziono – tyrondis

1

Czy możesz upewnić się, że /usr/lib/libboost_filesystem.so.1.42.0 nie jest martwym ogniwem?

7

Najpierw spróbuj wydać ldconfig -p | grep libboost_filesystem.so w konsoli, aby upewnić się, że biblioteka znajduje się w Twojej pamięci podręcznej LD.

Jeśli tak nie jest, być może trzeba dodać plik o nazwie jak boost.conf do /etc/ld.so.conf.d katalogu. Ten plik powinien zawierać ścieżkę do twoich bibliotek boost. Następnie uruchom sudo ldconfig, aby zaktualizować pamięć podręczną systemu.

nadzieję, że pomoże ...

+1

thx, wydaje się dobrym sposobem na zrobienie tego. Może standardowy? – unludo

1

jest/usr/lib w zmiennej środowiskowej LD_LIBRARY_PATH?

Powiązane problemy