2013-01-08 8 views
7

Próbuję użyć crosstools-ng do kompilacji programu, który używa pthread, jednak z jakiegoś powodu linker nie może znaleźć biblioteki. Sprawdziłem i biblioteki znajdują się w ścieżce łącza określonej przez -L jest argumenty.crosstools-ng nie można znaleźć pthread.so

Tutaj jest błąd:

/home/***/raspberrypi/toolchain/lib/gcc/arm-unknown-linux-gnueabi/4.6.3/../../../.. /arm-unknown-linux-gnueabi/bin/ld: cannot find /lib/arm-linux-gnueabihf/libpthread.so.0 

/home/***/raspberrypi/toolchain/lib/gcc/arm-unknown-linux-gnueabi/4.6.3/../../../../arm-unknown-linux-gnueabi/bin/ld: cannot find /usr/lib/arm-linux-gnueabihf/libpthread_nonshared.a 

Dlaczego nie można ld znaleźć plik, który jest w drodze?

+0

czy to jest zepsute dowiązanie symboliczne? –

+0

Jeśli dodaję dowiązanie symboliczne z/lib/arm-linux-gnueabihf i/usr/lib/arm-linux-gnueabihf, to kompiluje. Dowiązania symboliczne w katalogach są względne. – John

+0

/usr/lib/libpthread.so z twojego toolchain jest skryptem linkera. Czy możesz opublikować zawartość tego pliku, ponieważ nie rozumiem, dlaczego jest to /lib/arm-linux-gnueabihf/libpthread.so.0 zamiast zwykłego /lib/libpthread.so.0 –

Odpowiedz

4

Edycja .../usr/lib/arm-linux-gnueabihf/libpthread.so:

/* GNU ld script 
Use the shared library, but some functions are only in 
the static library, so try that secondarily. */ 
OUTPUT_FORMAT(elf32-littlearm) 
GROUP (/lib/arm-linux-gnueabihf/libpthread.so.0 /usr/lib/arm-linux-gnueabihf/libpthread_nonshared.a) 

do

/* GNU ld script 
Use the shared library, but some functions are only in 
the static library, so try that secondarily. */ 
OUTPUT_FORMAT(elf32-littlearm) 
GROUP (libpthread.so.0 libpthread_nonshared.a) 
2

Zobacz tę stronę INFO: https://sourceware.org/binutils/docs-2.24/ld/File-Commands.html#File-Commands

Przeczytaj definicje INPUT i GROUP, w szczególności:

W przypadku sysroot pref ix jest skonfigurowany, a nazwa pliku zaczyna się od znaku `/ ', a przetwarzany skrypt znajduje się w przedrostku sysroot, nazwa pliku będzie poszukiwana w przedrostku sysroot. W przeciwnym razie linker spróbuje otworzyć plik w bieżącym katalogu. Jeśli nie zostanie znaleziony, linker przeszuka ścieżkę przeszukiwania biblioteki archiwum. Zobacz opis `-L 'w Opcje wiersza poleceń.

Więc skrypt łącznik powinien być:

/* GNU ld script 
Use the shared library, but some functions are only in 
the static library, so try that secondarily. */ 
OUTPUT_FORMAT(elf32-littlearm) 
GROUP (/lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a) 

... jak Twój toolchain wykorzystuje prefiks sysroot.

można znaleźć sysroot prefiks z:

<tuple>-gcc -print-sysroot 
1

Korzystanie flagę GCC --sysroot=dir powinno rozwiązać ten problem. Ta flaga informuje GCC, aby przeszukał zarówno nagłówki, jak i biblioteki w folderze dir.

W twoim przypadku, jeśli dodasz --sysroot=/home/user/rpi_root do flag łącznika, ld będzie szukać /home/user/rpi_root/lib/libpthread.so.0 zamiast tylko /lib/libpthread.so.0.

Jest to szczególnie przydatne do naprawiania łączenia z fullpath do biblioteki.

Podczas korzystania z CMake do generowania systemu kompilacji, należy użyć SET(CMAKE_SYSROOT ${RPI_ROOT_PATH}), gdzie RPI_ROOT_PATH zawiera ścieżkę do sysroot RPi zamiast bezpośrednio ustawionych flag kompilatora.