Ich versuche, eine Demo zum Schreiben von PCM auf das I 2 S zu bringen. Ich habe ein kleines Demo-Programm erstellt, das beim Ausführen mit dem folgenden Befehl einen Fehler ausgibt./demo stereo_small.wav
can't open /dev/mem
Ich starte also mit diesem Befehl sudo ./demo stereo_small.wav
(hinzugefügt sudo
) und die Demo sollte nun erfolgreich mit erhöhten Berechtigungen ausgeführt werden können.
Aber ich bekomme jetzt diesen Fehler:
./demo: error while loading shared libraries: libsndfile.so.1: cannot open shared object file: No such file or directory
Um das Programm zum Laufen zu bringen, musste ich diesen Befehl zunächst ausführen export LD_LIBRARY_PATH=/usr/local/lib
, damit er funktioniert, und jetzt ist der Fehler zurückgekehrt, aber nur, wenn ich dem Befehl das Präfix vorstellesudo
Bitte nackt mit mir Ich benutze C & Linux erst seit ein paar Stunden!
Folgendes habe ich getan, um zu kompilieren und auszuführen:
gcc `pkg-config --cflags sndfile` -c demo.c
gcc 'pkg-config --libs sndfile' demo.o -o demo
sudo ./demo stereo_small.wav
Update - Ursache: Einige Umgebungsvariablen werden im SU-Kontext nicht verwaltet (siehe hier)
quelle
linux
Tag ist wahrscheinlich redundant. Es wäre besser, wenn Sie stattdessen Ihre Distribution bereitstellen würden (wahrscheinlich Debian).libsndfile
es dort ist, wo du denkst? Überprüfen Sie dieses Verzeichnis. Überprüfen Sie auch die Ausgabe vonecho $LD_LIBRARY_PATH
Übereinstimmungen./dev/mem
?Antworten:
Es ist ein kleiner Hack, bis ich herausgefunden habe, wie man richtig kompiliert und verknüpft oder die Anforderung für sudo aus dem 'fertigen' Code verschiebt. aber hier ist eine Option ...
Führen Sie die Shell unter sudo aus und fügen Sie die Umgebungsvariable set hinzu, bevor Sie das Programm ausführen:
quelle
sudo bash
können Sie die aktuelle Shell mit behaltensudo -s
.Wenn Sie
su
stattdessen verwendensudo
, können Sie einen Befehl an die Root-Shell übergeben, damit dieser ausgeführt werden kann:Das Problem bei der Verwendung
sudo
besteht darin, dass die Variable, die wir exportieren möchten, in der Root-Shell erhalten bleibt. Ich bin mir nicht sicher warum.quelle
Es ist wahr, dass
sudo
die Umgebungsvariablen aus Sicherheitsgründen "gelöscht" werden (weiterführende Literatur hier ).Wie in dieser großartigen Antwort vorgeschlagen , können Sie jedoch Umgebungsvariablen zusammen mit Ihrem Aufruf an übergeben
sudo
. In Ihrem Fall würde dies ungefähr so aussehen:Übergeben Sie also Ihre Umgebungsvariablen im Formular
VAR=VALUE
. Dies halte ich für besser, da es die Verwendungsu
und andere "hackige" Ansätze vermeidet .quelle