Không thể truy cập các thư viện được chia sẻ khi chạy với sudo


8

Tôi đang cố gắng để có một bản demo làm việc viết PCM lên I 2 S; Tôi đã tạo một chương trình demo nhỏ gây ra lỗi khi tôi chạy bằng lệnh sau./demo stereo_small.wav

can't open /dev/mem

Vì vậy, tôi chạy với lệnh này sudo ./demo stereo_small.wav (đã thêm sudo) và bản demo bây giờ có thể chạy thành công với các đặc quyền nâng cao.

Nhưng bây giờ tôi gặp lỗi này:

./demo: error while loading shared libraries: libsndfile.so.1: cannot open shared object file: No such file or directory

Ban đầu, để chương trình hoạt động, tôi phải thực thi lệnh này export LD_LIBRARY_PATH=/usr/local/libchỉ để nó hoạt động, và bây giờ lỗi đã quay trở lại, nhưng chỉ khi tôi tiền tố lệnh vớisudo

Xin hãy trần trụi với tôi Tôi chỉ mới sử dụng C & Linux trong vài giờ!

Đây là những gì tôi đã làm để biên dịch và chạy:

gcc `pkg-config --cflags sndfile` -c demo.c
gcc 'pkg-config --libs sndfile' demo.o -o demo
sudo ./demo stereo_small.wav

Cập nhật - Nguyên nhân: một số biến môi trường không được duy trì trong bối cảnh SU xem tại đây


1
Các linuxthẻ có lẽ là không cần thiết. Sẽ tốt hơn nếu bạn cung cấp bản phân phối của mình thay vào đó (có thể là Debian).
Jivings

Bạn có chắc chắn đó libsndfilelà nơi bạn nghĩ rằng nó là? Kiểm tra thư mục đó. Ngoài ra kiểm tra đầu ra của echo $LD_LIBRARY_PATHtrận đấu nó.
Jivings

Bạn thực sự đang cố gắng làm gì với /dev/mem?
Jivings

Tôi đang cố gắng ghi vào đầu ra GPIO / I2S! xem tại đây: raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496
Tai chó

Tôi thích ném mình vào tận cùng!
Tai chó

Câu trả lời:


3

Đó là một chút hack cho đến khi tôi tìm ra cách biên dịch và liên kết chính xác hoặc di chuyển yêu cầu cho sudo từ mã 'đã hoàn thành'; nhưng đây là một lựa chọn ...

chạy shell theo sudo và thêm thiết lập biến môi trường trước khi thực hiện chương trình:

sudo bash
export LD_LIBRARY_PATH=/usr/local/lib
./demo stereo_small.wav

Thay vì sudo bashbạn có thể giữ vỏ hiện tại với sudo -s.
Jivings

0

Nếu bạn sử dụng suthay vì sudosau đó bạn có thể truyền một lệnh đến shell gốc để nó thực thi:

su --command="export LD_LIBRARY_PATH=/usr/local/lib && ./demo stereo_small.wav"

Vấn đề với việc sử dụng sudolà biến mà chúng tôi đang cố gắng xuất không tồn tại trên vỏ gốc. Tôi không thực sự chắc chắn tại sao.


1
vẫn gặp lỗi trong khi tải thư viện dùng chung :(
Dog Ears

0

Đúng là sudo"bỏ" Biến môi trường vì lý do bảo mật (đọc thêm tại đây ).

Tuy nhiên, như được đề xuất trong câu trả lời tuyệt vời này, bạn có thể chuyển các biến môi trường cùng với lệnh gọi của bạn sudo. Trong trường hợp của bạn, nó sẽ trông giống như thế này:

sudo LD_LIBRARY_PATH=/usr/local/lib ./demo stereo_small.wav

Đó là, vượt qua (các) biến môi trường của bạn dưới dạng VAR=VALUE. Điều này tôi cho là tốt hơn vì nó tránh sử dụng suvà các cách tiếp cận "hacky" khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.