Sử dụng thư viện dùng chung trong / usr / local / lib


59

Tôi đã xây dựng một số thư viện từ các nguồn và các tệp sau đó make installnằm trong/usr/local/lib

Ví dụ, trong trường hợp của tôi, tôi có tập tin libodb-2.2.sonằm trong thư mục này.

Tuy nhiên, khi tôi khởi chạy chương trình thực thi đã liên kết với libodb, tôi đã gặp lỗi: lỗi trong khi tải các thư viện chia sẻ:libodb-2.2.so: cannont open shared object file: No such file or directory.

Có nghĩa là tôi đã xây dựng thực thi của tôi không chính xác? hoặc tôi nên chỉ ra hệ thống rằng có thể có một số lib thú vị trong thư mục /usr/local/lib?

Tôi đang sử dụng Ubuntu 12.04, Linux kernel 3.2.0-38-generic.



Tôi thực sự khuyên bạn nên tạo mối quan hệ hữu nghị tốt với trình gỡ lỗi của mình
DDS

@DDS Tôi đề nghị bạn giải thích thêm một chút. Bạn biết đó là một trang web hợp tác ở đây. Xin vui lòng, chỉ ra cách gdbcó thể đã giúp trong dù sao với một linkvấn đề, ví dụ. Tôi thực sự tò mò. Lúc đầu nhận xét của bạn dường như không liên quan đến vấn đề. Nhưng tôi có thể sai. Quả thực tôi không biết đủ gdb, và việc tải các thư viện.
Stephane Rolland

Xin lỗi ... bình luận này đáng lẽ phải được đặt trên stackoverflow về câu hỏi của người học về lập trình C ... chỉ không thấy là U & L
DDS

@DDS Người mới bắt đầu học lập trình C, hoặc học xây dựng trên Linux? Xin vui lòng, chính xác hơn. Ví dụ tôi đến từ Windows. Điều đó không có nghĩa là tôi không biết C ++ ... Tôi có xu hướng nghĩ rằng hành vi phán xét của bạn là không chính xác. Ngay cả khi đã có trên SO, hành vi của bạn sẽ sớm nhận được sự chú ý của người điều hành. Hãy nhận ra điều đó. Bạn đang ở trên một trang web THU THẬP, gồm những lập trình viên nhiệt tình chia sẻ kiến ​​thức hữu ích. Không phải nơi nào đó thiết kế để tâng bốc cái tôi của bạn. (Đừng lo lắng tôi cũng đã bị đánh nhẹ nhàng / hợp lý khi tôi bắt đầu SO và tôi nghĩ đó là một điều thực sự tốt đã xảy ra).
Stephane Rolland

Câu trả lời:


59

Đối với phiên hiện tại, bạn có thể

xuất LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

hoặc để thay đổi vĩnh viễn, bạn có thể thêm /usr/local/libvào /etc/ld.so.conf(hoặc một cái gì đó bao gồm) và chạy ldconfigdưới quyền root.

Nếu bạn vẫn gặp sự cố, việc chạy ldd [executable name]sẽ hiển thị cho bạn các thư viện mà nó đang cố gắng tìm và những thư viện nào không thể tìm thấy.


3
Từ mantrang ldd(1)"Trong trường hợp thông thường, ldd gọi trình liên kết động tiêu chuẩn (xem ld.so(8)) với LD_TRACE_LOADED_OBJECTSbiến môi trường được đặt thành 1, khiến trình liên kết hiển thị các phụ thuộc thư viện. Tuy nhiên, trong một số trường hợp, một số phiên bản lddcó thể cố gắng để có được thông tin phụ thuộc bằng cách trực tiếp thực thi chương trình. Do đó, bạn không bao giờ nên sử dụng lddmột tệp thực thi không đáng tin cậy , vì điều này có thể dẫn đến việc thực thi mã tùy ý. Một cách khác an toàn hơn khi xử lý các thực thi không đáng tin cậy là: ... "
SlySven

4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven

Đẹp một - tôi chưa bao giờ đi qua objdump trước đây.
Flup

Theo này bài viết câu trả lời này là theo giáo luật không chính xáccó hại . Đối với một cách tiếp cận đúng việc sử dụng -L-rpathtrong quá trình biên dịch để thiết lập các đường dẫn tìm kiếm liên kết và đường dẫn tìm kiếm thời gian chạy cho các thư viện là cách chính xác, theo này câu hỏi và câu trả lời.
Cliff Armstrong

37

Nếu bạn đã chạy ldconfigsau khi xây dựng thư viện, hãy tiếp tục đọc. Nếu không, hãy đọc aboout ldconfig trước.

/usr/local/libcó thể không có trong đường dẫn thư viện mà ldconfig sử dụng. Bạn chỉ có thể làm điều này:

ldconfig /usr/local/lib

Và các công cụ nên được thêm vào bộ đệm liên kết, nhưng có lẽ tốt hơn là thêm đường dẫn đúng. Hãy chắc chắn rằng bạn có một /etc/ld.so.conf.dthư mục. Nếu vậy hãy thêm một tệp (gọi nó là "usr-local.conf" hoặc bất cứ thứ gì) và đặt một dòng trong đó:

/usr/local/lib

Bây giờ chạy ldconfig. Nếu bạn không có thư mục ld.so.conf.d, bạn nên có một /etc/ld.so.conf tệp và bạn có thể thêm dòng đó vào cuối của nó.


3
Tôi đã thêm một tệp custom.conf để /etc/ld.so.conf.dsau đó sudoed ldconfig để đưa nó vào tài khoản và việc thực thi của tôi có thể bắt đầu ngay bây giờ.
Stephane Rolland
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.