Vì vậy, tôi có một chương trình chạy với OpenBlas và tôi muốn biên dịch nó. Quá trình liên kết trông giống như sau:Tại sao LD_LIBRARY_PATH là BAD và cách chính xác để tải thư viện động
gcc -o prog prog.o -O3 -I/opt/OpenBLAS/include -L/opt/OpenBLAS/lib -lopenblas
Cho đến nay rất tốt. Nếu tôi xóa tùy chọn -L
, tôi gặp lỗi trong quy trình liên kết
/usr/bin/ld: cannot find -lopenblas
Với mọi liên kết không có lỗi. Tuy nhiên, khi tôi cố gắng chạy nó tôi nhận được lỗi sau:
./prog: error while loading shared libraries: libopenblas.so.0: cannot open shared object file: No such file or directory
Nếu tôi đặt biến env LD_LIBRARY_PATH
-/opt/OpenBlas/lib
tôi có thể chạy các chương trình, nhưng nhiều nguồn như http://xahlee.info/UnixResource_dir/_/ldpath.html coi đây là một thực tế xấu và tôi có thể hiểu hầu như tất cả các lý do. Phương pháp khác được đề cập trong bài viết (sửa đổi cấu hình ld) cũng được coi là một thực tế không tốt. Cuối cùng, bạn chỉ có thể thêm một liên kết tượng trưng vào thư viện trong /usr/lib
. Một vấn đề lớn với hai phương thức cuối cùng là bạn cần truy cập sudo. Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể biên dịch và chạy một chương trình liên kết với một thư viện được chia sẻ không nằm trong đường dẫn mặc định (/usr/lib
) mà không cần sử dụng LD_LIBRARY_PATH
và truy cập sudo. Trong bài viết họ nói rằng bạn chỉ có thể 'viết' trong nhị phân nơi để tìm kiếm các thư viện được chia sẻ nhưng tôi không biết làm thế nào để làm điều đó (cờ -L
dường như không được làm điều đó). Tôi sẽ đánh giá cao nếu bất cứ ai có thể giải thích vấn đề này, vì tôi đã tìm kiếm ở khắp mọi nơi và tôi rất bối rối (một số tài liệu tham khảo dường như cho rằng cờ `-L 'nên làm điều đó nhưng tôi không làm việc cho tôi). Cảm ơn bạn trước.
Bạn có thể sử dụng -rpath để thiết lập các đường dẫn tìm kiếm thư viện runtime – sshannin