andere libstdc++.so.6 nutzen

ZuseZ3

Lt. Commander
Registriert
Jan. 2014
Beiträge
1.659
System: Raspberry pi 4 2GB mit Raspbian 64Bit Beta.
Ich habe ein Pytorch wheel gefunden, welches gepasst hat und sich installieren lies.
Es wurde allerdings cross-compiled mit einem Gcc/G++-9.1, welches nicht verfügbar war.
Ich habe es daher nachinstalliert und als default gesetzt, gcc -v gibt nun die gewünsche Version 9.1 aus.
Die dazugehörige libstdc++ wird jedoch noch nicht genutzt, weswegen mein Python testscript welches pytorch nutzt crasht.

Python:
Traceback (most recent call last):
  File "inference.py", line 1, in <module>
    import torch
  File "/home/pi/.local/lib/python3.7/site-packages/torch/__init__.py", line 81, in <module>
    from torch._C import *
ImportError: /usr/lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /home/pi/.local/lib/python3.7/site-packages/torch/lib/libtorch_python.so)

Die Lösung liegt eigentlich recht nahe. Laut den Docs habe ich ja die richtige Version verfügbar: https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html. Auch strings /opt/gcc-9.1.0/lib/libstdc++.so | grep GLIBCXX gibt (unter anderen) GLIBCXX_3.4.26 aus.
Es geht also nur daru, dass das System/Programm die richtige libstdc++ unter /opt/gcc... statt unter /usr/lib nutzt.
Wie bekomme ich das hin? Folgendes setzten vom LD_LIBRARY_PATH hat nicht geholfen:
echo $LD_LIBRARY_PATH
/opt/gcc-9.1.0/lib:


Ich habe testweise auch das bisherige libstdc++ in /usr/lib entfernt und ein symlink nach /opt/.. eingesetzt.
Nun erhalte ich den folgenden Fehler.
Python:
Traceback (most recent call last):
  File "inference.py", line 1, in <module>
    import torch
  File "/home/pi/.local/lib/python3.7/site-packages/torch/__init__.py", line 81, in <module>
    from torch._C import *
ImportError: libstdc++.so.6: wrong ELF class: ELFCLASS32
 
Zuletzt bearbeitet:
Punkt 3.4 in https://gcc.gnu.org/onlinedocs/libstdc++/faq.html erklärt, dass die Variable nicht zwingend LD_LIBRARY_PATH heißt. Das hängt insbesondere von deinem System ab. Ich habe ehrlich gesagt keine Ahnung wie Raspbian das regelt.

Das ebenfalls von Debian abgeleitete Ubuntu jedenfalls interessiert sich nicht besonders für die Variable. Siehe hier: https://help.ubuntu.com/community/EnvironmentVariables#File-location_related_variables

Ich vermute es nie an dem Ort nachgeguckt, weil die Konfiguration an der falschen Stelle und/oder auf die falsche Art vorgenommen wurde.

Nachtrag: Eine kurze Websuche sagt mir, dass du scheinbar /etc/ld.so.conf erweitern und anschließend ldconfig als root ausführen musst.
 
Exakt, ist eine 32bittige Library. Hast die falsche geladen.

Zu dem LD_LIBRARY_PATH: Hast du ihn auch mit export exportiert? Wenn ja, gibt es noch ein paar andere Fallstricke. Das PyTorch-Shared-Object könnte z.B. mit /usr/lib als RUNPATH gelinkt sein.
 
  • Gefällt mir
Reaktionen: GTrash81
nullPtr schrieb:
Exakt, ist eine 32bittige Library. Hast die falsche geladen.

Zu dem LD_LIBRARY_PATH: Hast du ihn auch mit export exportiert? Wenn ja, gibt es noch ein paar andere Fallstricke. Das PyTorch-Shared-Object könnte z.B. mit /usr/lib als RUNPATH gelinkt sein.

@nullPtr
Genau, es scheint eine 32 Bit Version zu sein. Mir ist aber nicht klar wie ich die 64Bit Version bekomme? Davor ist die ganze Diskussion um das richtige Verlinken ja nutzlos.
Die bisherige gcc Version habe ich von hier https://gist.github.com/sol-prog/95e4e7e3674ac819179acf33172de8a9
 
Gibt's kein apt-Repo, das du in ARM-Debian einbinden könntest, was deine Wünsche erfüllt?

Andernfalls würde ich vorschlagen, dass du das eigentliche Problem angehst: Kompiliere das PyTorch einfach selbst. Dann arbeitest du wenigstens an deinem Ziel :) wer weiß, was noch kommt, wenn du dieses libstdc++-foobar beseitigt hast.
 
Zurück
Oben