2011-11-07 17 views
15

Próbuję skompilować jeden z projektów znalezionych tutaj Adapter interfejsu USB-I2C/SPI/GPIO.Nie można otworzyć pliku udostępnionego obiektu

Pobrałem pakiet i2c_bridge-0.0.1-rc2.tgz. Zainstalowałem libusb i wydawało się, że wszystko idzie dobrze bez żadnych problemów. Przechodzę do katalogu i2c_bridge-0.0.1-rc2/ i robię. To kompiluje. Przechodzę do folderu i2c_bridge-0.0.1-rc2/i2c i robię. Kompiluje się i daje mi ./i2c. Jednak po uruchomieniu jest to plik Makefile w katalogu , który ma katalog biblioteki jako ../. libi2cbrdg.so znajduje się w tym katalogu (i2c_bridge-0.0.1-rc2). Również skopiowałem plik do /usr/local/lib. ls katalogu i2c_bridge-0.0.1-rc2/ jest

i2c  i2cbrdg.d i2cbrdg.o libi2cbrdg.a Makefile tests 
i2cbrdg.c i2cbrdg.h INSTALL libi2cbrdg.so README u2c4all.sh 

(To i2c jest katalogiem)

Gdybym sudo ./i2c, to wciąż daje mi ten problem.

Musiałem usunąć opcje -Werror i -noWdecrepated (pisowni?) We wszystkich plikach makefile, aby je skompilować, ale to nie powinno mieć na to wpływu?

Co jeszcze jest konieczne, aby znaleźć plik .so? Jeśli ktokolwiek może mi pomóc dowiedzieć się, co jest nie tak, byłbym bardzo wdzięczny. Jeśli potrzebujesz więcej informacji, mogę to opublikować.

Odpowiedz

39

Musisz rozróżnić znalezienie tak w kompilacji i podczas wykonywania. Flaga -L podana podczas kompilacji nie ma nic wspólnego z lokalizowaniem biblioteki w czasie wykonywania. Odbywa się to raczej za pomocą wielu zmiennych i niektórych ścieżek osadzonych w bibliotece.

Najlepszy hot-fix dla tego problemu jest często ustawienie LD_LIBRARY_PATH do katalogu z plikiem .so, np:

$ LD_LIBRARY_PATH=.. ./i2c 

Dla długoterminowego rozwiązania, trzeba też mieć się bliżej cały system LD z rpath i runpath lub użyj libtool (który rozwiązuje te problemy dla ciebie).

Kopiowanie pliku do katalogu/usr/local/lib jest często niewystarczające, ponieważ ld buforuje dostępne biblioteki, więc po skopiowaniu biblioteki do katalogu/usr/local/lib należy ponownie uruchomić program ldconfig (jako root).

+0

Czy LD_LIBRARY_PATH dla wszystkich moich bibliotek? Więc jeśli zrobię to polecenie, to zepsuje inne rzeczy, dopóki go nie zmienię? Jak mogę sprawdzić, do czego jest ustawiony? – Sterling

+2

Jest to zmienna środowiskowa. Możesz to sprawdzić za pomocą "echo $ LD_LIBRARY_PATH", a sposób, w jaki jest ustawiony w linii poleceń, jest lokalny dla procesu i2c i jego podprocesów. – thiton

+1

Nie moje pytanie, ale dzięki temu pomogło rozwiązać mój dokładny problem – Rich

25

Jeśli budujesz kod ze źródła, które potrzebuje biblioteki, możesz umieścić ścieżkę do biblioteki w zmiennej środowiskowej LD_RUN_PATH przed budowaniem, a linker zapisze tę ścieżkę w pliku binarnym, aby będzie automatycznie poszukiwany we właściwym miejscu w czasie wykonywania.

specyficzne dla Linuksa: Alternatywnie, umieścić bibliotekę w /lib, /usr/lib, lub jakąś inną ścieżkę odwołuje się swoimi /etc/ld.so.conf lub jego fragmentów importowanych konfiguracji, a następnie wszystko, co trzeba zrobić, to uruchomić /sbin/ldconfig odświeżyć ld.so (dynamiczny linker) pamięć podręczna bibliotek.

+0

Mimo że miałem '/ usr/local/lib' w'/etc/ld.so.conf.d/libc.conf', ** biblioteka linków dynamicznych odświeżanie bufora podręcznego ** z 'sudo ldconfig' jest tym, co mi to zrobiło. –

1

To działa dla mojego problemu, mam nadzieję, że pomoże każdemu.

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg 

I kluczową sztuczką jest opcja -Wl,-rpath.

Powiązane problemy