Ubuntu tìm thư viện chia sẻ ở đâu?


24

Khi tôi chạy một quy trình liên kết đến thư viện dùng chung trong thời gian chạy (được liên kết khi quá trình bắt đầu, không được liên kết sau đó dlload()), thì nó tìm .sotệp thư viện chia sẻ ( ) khác ở LD_LIBRARY_PATHđâu?

Lý lịch:

Tôi có một số mã C ++ mà tôi đã viết sử dụng thư viện của bên thứ ba cụ thể. Tôi đã cài đặt thư viện và biên dịch mã của mình trên hai nền tảng khác nhau, cả Ubuntu nhưng các phiên bản khác nhau và các phiên bản gcc khác nhau. Thư viện được biên dịch và cài đặt từ nguồn, và được đặt /usr/local/libtrên cả hai nền tảng. Khi tôi biên dịch mã của mình, tôi liên kết với các pkg-config --libstham số cho thư viện bên thứ ba và tôi đã xác minh rằng pkg-config --libstrả về cùng một thứ chính xác trên cả hai nền tảng.

Mã của tôi biên dịch thành công trên cả hai nền tảng và LD_LIBRARY_PATHkhông được xác định (hoặc được xác định là trống "":) trên cả hai nền tảng. Tuy nhiên, khi tôi chạy nó trên một platoform, nó hoạt động tốt và mặt khác tôi gặp lỗi này:

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

Thật thú vị, những cái không hoạt động là phiên bản mới hơn của Ubuntu và gcc. : /

Vì vậy, tôi đang cố gắng tìm ra cách người làm việc có thể định vị thư viện, để tôi có thể làm cho cái bị hỏng định vị thư viện theo cùng một cách. (tức là không cần cài đặt LD_LIBRARY_PATH)

Cập nhật:

Đây là đầu ra của tôi từ cat /etc/ld.so.conf.d/*

... trên hệ thống làm việc (cũ hơn):

/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

... trên hệ thống bị hỏng (mới hơn):

# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa

1
Tôi nghĩ những nơi đó được xác định /etc/ld.so.conf.d/*.conf, nhưng tôi không chắc về nó.
Salem

Có vẻ như vậy, nhưng hãy xem bản cập nhật của tôi về OQ để biết nội dung của các tệp đó ... Vì vậy, có vẻ như nó sẽ tìm thấy /usr/local/lib/libthrift-0.9.0.sonhưng nó vẫn báo lỗi error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... Có lý do nào khiến nó không nhận được thư mục từ đó /etc/ld.so.conf.d/*.confkhông?
Dave Lillethun

3
Cố gắng chạy sudo ldconfig -vnhư đề xuất dưới đây. Nếu nó vẫn không hoạt động, hãy cập nhật câu hỏi của bạn với đầu ra của ldd /path/to/your/application.
Salem

Câu trả lời:


29

Toàn bộ con đường kinh doanh này có liên quan đến một cái gì đó gọi là đa vòm. Về cơ bản, nó cho phép bạn có các thư viện 32 bit và 64 bit trên cùng một hệ thống.

Sau khi bạn sao chép tập tin, bạn có chạy ldconfig không?

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.

Tôi đã chạy sudo ldconfigvà đã khắc phục vấn đề! (Không cần biên dịch lại mã của tôi hoặc bất cứ điều gì ...) Tôi chỉ muốn hiểu, mặc dù ... Bạn đã nói "Sau khi bạn sao chép tệp", nhưng tôi đã không sao chép tệp. Bạn có nghĩa là sau khi tôi xây dựng và cài đặt thư viện, hoặc sau khi tôi biên dịch chương trình của mình?
Dave Lillethun

Sau khi bạn đặt nó, nơi bạn đặt nó. Về cơ bản một bộ đệm thư viện được xây dựng. Tôi nghĩ khởi động lại cũng có thể xây dựng lại bộ đệm.
Matt H

Tôi có thể nhầm, nhưng tôi tin rằng tôi đã khởi động lại kể từ khi cài đặt thư viện ... Tuy nhiên, sudo ldconfigđã làm được mẹo. Đây có phải là thứ mà các thư viện thường tự động chạy cho bạn như là một phần của cài đặt của họ và cái này vì một số lý do không? Chỉ tự hỏi tại sao tôi không "bình thường" phải làm điều này, nhưng chỉ làm trong trường hợp này ...
Dave Lillethun

Thông thường cài đặt gói sẽ chạy ldconfig trong quá trình cài đặt tôi nghĩ. Có thể phiên bản trên bản phân phối mới hơn của bạn không hoạt động vì một số lý do.
Matt H

1

Thông tin trong câu hỏi trên và đầu tiên (và duy nhất ATT) câu trả lời , đã giúp tôi giải quyết * a * vấn đề tương tự của tôi trên WSL Ubuntu (trên Win10 64)!

Trong trường hợp của tôi , thực thi không thể tìm thấy một thư viện. Tôi cuối cùng nhận thấy rằng các thư viện mới làm đã định vị trong /usr/lib64, nhưng các đường đa vòm /etc/ld.so.conf.d/x86_64-linux-gnu.conf đã không bao gồm thư mục đó.

Vì vậy, tôi đã chạy

sudo ldconfig /usr/lib64

và cuối cùng đã sửa nó. (chạy một mình mà không có tham số thư mục không làm cho nó 'kỳ diệu' tìm các thư viện BTW.) Không rõ liệu 'khởi động lại' bash WSL của tôi có giúp được không ... Tôi nghĩ rằng điều đó thậm chí không cần thiết.


Điều tương tự cũng xảy ra với tôi với / usr / local / lib /. Tôi đã tạo một tệp /etc/ld.so.conf.d/usr-local.confvà sau đó chạy sudo ldconfigmà không có hiệu lực - các thư viện trong thư mục đó không được trình tải tìm thấy. Sau khi chạy sudo ldconfig /usr/local/libmọi thứ hoạt động tốt.
Josh Milthorpe
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.