2013-01-08 25 views
7

Sto tentando di utilizzare crosstools-ng per compilare un programma che utilizza pthread, tuttavia per qualche motivo il linker non riesce a trovare la libreria. Ho controllato e le librerie si trovano nel percorso di collegamento specificato da -L sono gli argomenti.crosstools-ng non riesce a trovare pthread.so

Ecco l'errore:

/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 

Perché non è possibile ld trovare il file che si trova all'interno del percorso?

+0

questo file è un collegamento simbolico non funzionante? –

+0

Se aggiungo un collegamento simbolico da/lib/arm-linux-gnueabihf e/usr/lib/arm-linux-gnueabihf lo compila. I collegamenti simbolici nelle directory sono tutti relativi. – John

+0

/usr/lib/libpthread.so dalla tua toolchain è uno script linker. Puoi pubblicare i contenuti di questo file poiché non capisco perché questo è /lib/arm-linux-gnueabihf/libpthread.so.0 invece del normale /lib/libpthread.so.0 –

risposta

4

Modifica il tuo .../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) 

a

/* 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

Vedere questa pagina Info: https://sourceware.org/binutils/docs-2.24/ld/File-Commands.html#File-Commands

Leggi le definizioni di INPUT e GROUP, in particolare:

In caso di pref di sysroot ix è configurato e il nome del file inizia con il carattere `/ 'e lo script in fase di elaborazione si trovava all'interno del prefisso sysroot, il nome del file verrà cercato nel prefisso sysroot. In caso contrario, il linker tenterà di aprire il file nella directory corrente. Se non viene trovato, il linker cercherà attraverso il percorso di ricerca della libreria di archivio. Vedi la descrizione di `-L 'in Opzioni della riga di comando.

Quindi lo script del linker dovrebbe essere:

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

... come la vostra toolchain sta usando un prefisso sysroot.

È possibile trovare il prefisso sysroot con:

<tuple>-gcc -print-sysroot 
1

Utilizzando la bandiera GCC --sysroot=dir dovrebbe risolvere il problema. Questo flag indica a GCC di cercare entrambe le intestazioni e le librerie nella cartella dir.

Nel tuo caso, se si aggiunge --sysroot=/home/user/rpi_root alle bandiere linker, ld cercherà per /home/user/rpi_root/lib/libpthread.so.0 invece di /lib/libpthread.so.0.

Ciò è particolarmente utile per risolvere il collegamento con fullpath alla libreria.

Quando si utilizza CMake per generare il sistema di generazione, è necessario utilizzare SET(CMAKE_SYSROOT ${RPI_ROOT_PATH}), dove RPI_ROOT_PATH contiene il percorso di sysroot RPi invece di impostare direttamente i flag del compilatore.