2013-07-26 44 views
24

Tôi đang xây dựng một ứng dụng bằng cách sử dụng một khung được gọi là ohNet. Sau khi xây dựng khung, có khả năng cài đặt khung thông qua make install. Theo mặc định, các thư viện được cài đặt bên trong các thư mục /usr/local/[lib|include]. được.Thư viện trong/usr/local/lib không tìm thấy

Tôi đang sử dụng nhật thực để phát triển. Để sử dụng thư viện này, tôi phải đặt đường dẫn bao gồm thư viện (trong trường hợp này là usr/local/include/ohNet), đặt đường dẫn tìm kiếm Linker (-L) (/usr/local/lib/ohNet) và thư viện cụ thể (-l) (trong trường hợp này tôi chọn thư viện gọi libohNet.so trong thư mục này Khi tôi xây dựng dự án trong eclipse nó hoạt động tốt, tuy nhiên nếu tôi cố gắng chạy programm tôi đang phải đối mặt với thông báo sau:.

error while loading shared libraries: libohNet.so: cannot open shared object file: No such file or directory 

tôi đã hai lần kiểm tra điều này, và tập tin libohNet.so là trong thư mục này! Lý do mà tập tin này không thể tìm thấy là gì?

Tôi đã tìm kiếm trên google và tìm thấy một số bài đăng, cho biết rằng thư viện đang được cài đặt thành /usr/local/lib thay vì /usr/libsee here ... Tôi có phải định cấu hình một số cài đặt bổ sung trong eclipse để nhận dạng các thư viện trong đường dẫn này không? Giải pháp cho việc này là gì?

liên quan

+0

Thêm '-L/usr/local/lib' vào dòng liên kết của bạn. –

+0

tôi đã thiết lập đường dẫn tìm đường dẫn đến '/ usr/local/lib/ohNet' – Moonlit

+0

Sau đó, bạn cần kiểm tra xem bạn có thực sự đọc tệp hay không và đó là loại tệp .so đúng - ví dụ: trộn 32 và 64 bit? –

Trả lời

43

Đây là lỗi thời gian chạy, không phải lỗi xây dựng. Đặt cờ -L không làm gì cho trình liên kết thời gian chạy. Những gì bạn cần làm là cho trình tải thời gian chạy cũng xem/usr/local/lib cho các thư viện. Bạn có thể làm điều đó theo hai cách. Đầu tiên là thêm đường dẫn đến biến môi trường LD_LIBRARY_PATH:

 
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" 

Thứ hai là cập nhật tệp cấu hình của trình liên kết thời gian chạy. Điều này có thể xảy ra hoặc trong tập tin /etc/ld.so.conf, bằng cách đặt dòng:

 
/usr/local/lib 

đâu đó trong tập tin đó, hoặc bằng cách tạo ra một tập tin * conf mới trong /etc/ld.so .conf.d/thư mục chứa đường dẫn mới. Ví dụ:

 
/etc/ld.so.conf.d/99local.conf 

chỉ:

 
/usr/local/lib 

trong đó. Đây là cách được khuyến nghị để làm điều này, vì nó cho phép bạn giữ các đường dẫn thư viện tùy chỉnh của bạn tách biệt với các đường dẫn do hệ thống đặt. (Tiền tố "99" có ở đó để đảm bảo tệp được tải lần cuối so với các tệp khác ở đó, sao cho tệp đó không chặn trước đường dẫn hệ thống có thể chứa cùng thư viện.)

Sau khi bạn sửa đổi/tạo tệp trong/etc, bạn cần phải chạy:

 
ldconfig 

làm gốc để thay đổi có hiệu lực. (Lệnh này cập nhật tệp /etc/ld.so.cache, là tệp thực sự được sử dụng bởi trình liên kết thời gian chạy.)

Còn một cách khác để nhị phân tìm các thư viện cần thiết khi chạy. Bạn thực sự có thể tạo các đường dẫn thư viện mã cứng vào chính bản thân nó. Điều này được thực hiện bằng cách thiết lập một cái gọi là "rpath".Đây là tùy chọn trình liên kết và phải được chuyển từ gcc (hoặc g ++) sang trình liên kết, do đó, tùy chọn -Wl phải được sử dụng. Tùy chọn trình liên kết là -rpath=PATH. Vì vậy, bạn cần phải thêm thẻ này vào cờ liên kết của mình:

 
-Wl,-rpath=/usr/local/lib 

Tôi không khuyên bạn nên làm như vậy cho trường hợp của mình. Đường rpath rất hữu ích khi bạn đang vận chuyển thư viện cùng với tệp thực thi (có thể với trình cài đặt) và đường dẫn tương đối (sử dụng tính năng rpath $ORIGIN) hoặc đường dẫn tuyệt đối (ví dụ: khi bạn cài đặt/chọn tham gia) tìm những libs đi kèm lúc chạy.

+0

cảm ơn bạn đã trả lời chính xác. nếu thư viện của tôi nằm trong thư mục con của/usr/local/lib (ví dụ:/usr/local/lib/ohNet), tôi phải thêm từng đường dẫn vào các thư mục con. là có cách nào để nói với bộ tải thời gian chạy để tìm kiếm trong/usr/loal/lib đệ quy? – Moonlit

+0

@ user1291235 Bạn phải thêm từng đường riêng lẻ riêng rẽ theo dòng riêng của nó. –

+1

@ user1291235 Tôi quên đề cập đến tùy chọn liên kết đường đi. Tôi không khuyên bạn nên điều này trong trường hợp của bạn, nhưng nó là tốt đẹp để biết về vì vậy tôi đã thêm nó vào câu trả lời. –