crosstools-ng nicht finden können pthread.so
Ich versuche, mit crosstools-ng zum kompilieren ein Programm, das mit pthread, aber für einige Grund der linker nicht finden können, die Bibliothek. Ich habe überprüft, und die Bibliotheken sind in der link-Pfad specificed von -L
ist die Argumente.
Hier ist der Fehler:
/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
Warum kann nicht ld finden die Datei im Pfad?
- ist die Datei a broken symlink?
- Wenn ich einen symlink von /lib/arm-linux-gnueabihf und /usr/lib/arm-linux-gnueabihf es kompiliert. Die symlinks in den Verzeichnissen sind alle relativ.
- /usr/lib/libpthread.also von deiner toolchain ist ein linker-Skript. Kannst du den Inhalt dieser Datei, da ich verstehe es nicht, warum ist das in /lib/arm-linux-gnueabihf/libpthread.so.0 statt der regulären /lib/libpthread.so.0
- Ich bin mir nicht sicher was du meinst mit "/usr/lib/libpthread.also von deiner toolchain". Es ist eine Datei in diesem Pfad unter "toolchain" rootfs.
- Ja, es sollte eine Datei mit diesem Pfad in die toolchain-sysroot.
- Yup, es ist es aber für einige Grund es nicht sehen, es ohne einen symbolischen Link aus dem Verzeichnis system /lib/arm-linux-gnueabihf und /usr/lib/arm-linux-gnueabihf in die sysroot Verzeichnis. Das hat meine wirklich verwirrt, weil es nimmt andere libs richtig.
- Sorry ich war nicht klar, ich denke über die folgende Datei:
/home/***/raspberrypi/toolchain/arm-unknown-linux-gnueabi/sysroot/arm-unknown-linux-gnueabi/usr/lib/libpthread.so
(standard-installation mit crosstool-ng). Hast du diese Datei?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bearbeiten Sie Ihre .../usr/lib/arm-linux-gnueabihf/libpthread.also:
zu
Finden Sie unter dieser info-Seite:
https://sourceware.org/binutils/docs-2.24/ld/File-Commands.html#File-Commands
Lesen Sie die Definitionen der EINGANGS-und der GRUPPE, insbesondere:
Im Falle einer sysroot Präfix konfiguriert ist, und der Dateiname beginnt mit dem Zeichen`/', und das Skript verarbeitet wurde, befindet sich innerhalb der sysroot Präfix, das dem Dateinamen gesucht werden wird in das sysroot-Präfix. Andernfalls wird der linker versuchen, öffnen Sie die Datei in das aktuelle Verzeichnis. Wenn es nicht gefunden wird, wird der linker die Suche durch die archive library-Suchpfad. Siehe die Beschreibung der `-L' in Command Line Optionen.
So dass Ihr linker-Skript:
...wie deine toolchain ist mit einem sysroot Präfix.
Finden Sie Ihre sysroot Präfix mit:
Mithilfe der GCC
--sysroot=dir
flag sollte das Problem beheben.Dieses flag teilt der GCC Suche Header und Bibliotheken unter der
dir
Ordner.In Ihrem Fall, wenn Sie hinzufügen
--sysroot=/home/user/rpi_root
zu linker flags,ld
suchen/home/user/rpi_root/lib/libpthread.so.0
statt nur/lib/libpthread.so.0
.Dies ist besonders hilfreich, um fix die Verlinkung mit fullpath zur Bibliothek.
Bei der Verwendung von CMake zu generieren build-system verwenden, sollten Sie
SET(CMAKE_SYSROOT ${RPI_ROOT_PATH})
, woRPI_ROOT_PATH
enthält den Pfad zu dem RPi-sysroot statt direkt gesetzt werden compiler flags.