Lỗi Linux trong khi tải thư viện dùng chung: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy


356

Chương trình là một phần của bộ thử nghiệm Xenomai, được biên dịch chéo từ PC Linux thành chuỗi công cụ ARM + Xenomai ARM.

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 

Chỉnh sửa: OK Tôi không nhận thấy .1 ở cuối là một phần của tên tệp. Điều đó có nghĩa là gì?


277
Điều này có thể xảy ra nếu gần đây bạn đã cài đặt thư viện dùng chung và không chạy ldconfig (8) sau đó. Làm 'ldconfig', không có hại gì trong đó.
AbiusX

25
Nhận xét +1 cho @AbiusX - chạy sudo ldconfig (giả sử rằng các thư viện trên thực tế là nơi họ nên [/ usr / bin / lib /, / usr / bin / bao gồm /, / usr / local / lib / và / usr / local / bao gồm / AFAIK], vui lòng sửa cho tôi nếu tôi sai) có thể giải quyết vấn đề đó. Chúc mừng!
AeroCross

Lưu ý rằng lỗi này cũng có thể phát sinh nếu các quyền trên tệp lib của bạn bị thay đổi theo cách nào đó. Thay đổi quyền trở lại 644 đã giải quyết nó cho tôi.
Geoffrey H

Câu trả lời:


140

Cập nhật
Mặc dù những gì tôi viết dưới đây là đúng như một câu trả lời chung về các thư viện dùng chung, tôi nghĩ nguyên nhân thường gặp nhất của các loại tin nhắn này là do bạn đã cài đặt một gói, nhưng không cài đặt phiên bản "-dev" của gói đó.


Chà, nó không nói dối - không có libpthread_rt.so.1trong danh sách đó. Bạn có thể cần phải cấu hình lại và xây dựng lại nó để nó phụ thuộc vào thư viện bạn có hoặc cài đặt bất cứ thứ gì cung cấp libpthread_rt.so.1.

Nói chung, các số sau .so là số phiên bản và bạn sẽ thường thấy rằng chúng là các liên kết tượng trưng cho nhau, vì vậy nếu bạn có phiên bản 1.1 của libfoo.so, bạn sẽ có một tập tin thực libfoo.so.1.0, và symlink foo.so và foo.so.1 chỉ vào libfoo.so.1.0. Và nếu bạn cài đặt phiên bản 1.1 mà không xóa phiên bản khác, bạn sẽ có libfoo.so.1.1 và libfoo.so.1 và libfoo.so bây giờ sẽ trỏ đến phiên bản mới, nhưng bất kỳ mã nào yêu cầu phiên bản chính xác đó đều có thể sử dụng tệp libfoo.so.1.0. Mã chỉ dựa trên API phiên bản 1, nhưng không quan tâm nếu đó là 1.0 hoặc 1.1 sẽ chỉ định libfoo.so.1. Như orip đã chỉ ra trong các bình luận, điều này được giải thích tốt tại http://tldp.org/HOWTO/Program-L Library-HOWTO / shared-lologists.html .

Trong trường hợp của bạn, bạn có thể thoát khỏi liên kết tượng trưng libpthread_rt.so.1đến libpthread_rt.so. Tuy nhiên, không đảm bảo rằng nó sẽ không phá vỡ mã của bạn và ăn bữa tối trên TV của bạn.


5
... Trời ơi, .1 là một phần của tên tệp. Bất cứ ý tưởng nó có nghĩa là gì?
zaratustra

orip xứng đáng +1 cho liên kết đó. Nếu bạn không phiền, @orip, tôi muốn đặt liên kết của bạn vào câu trả lời?
Paul Tomblin

@PaulTomblin, tôi đang gặp lỗi tương tự trong khi sửa chữa grub. Bạn có thể giúp tôi về điều này? Câu hỏi này -> askubuntu.com/questions/123275/cant-repair-grub/...
Eray

@TomNysetvold và Paul, vâng - đó là cùng một tài liệu.
orip

Tôi đã tìm thấy rất nhiều thông tin xấu và giải pháp bùng binh trong quá trình tìm kiếm câu trả lời này. Một cái gì đó bên trong tôi bảo tôi tiếp tục tìm kiếm cho đến khi tôi tìm thấy một giải pháp chỉ huy.
c ..

327

Thư viện của bạn là một thư viện năng động. Bạn cần nói với hệ điều hành nơi nó có thể xác định vị trí của nó khi chạy.

Để làm như vậy, chúng ta sẽ cần phải thực hiện các bước đơn giản đó:

(1) Tìm nơi thư viện được đặt nếu bạn không biết.

sudo find / -name the_name_of_the_file.so

(2) Kiểm tra sự tồn tại của biến môi trường đường dẫn thư viện động ( LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

nếu không có gì để hiển thị, hãy thêm giá trị đường dẫn mặc định (hoặc không nếu bạn muốn)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Chúng tôi thêm đường dẫn mong muốn, xuất nó và thử ứng dụng.

Lưu ý rằng đường dẫn phải là thư mục chứa path.so.something. Vì vậy, nếu path.so.somethinglà trong /my_library/path.so.somethingnó nên:

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

nguồn: http://www.gnu.org/software/gsl/manual/html_node/Shared-Lologists.html


3
Câu trả lời được đề cập ở trên là rất rõ ràng, Cảm ơn bạn trước hết. Tôi đã thử làm điều này trong Đường dẫn dự án CDT Eclipse (Lubfox) của tôi. / Gỡ lỗi $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/ hom / thư viện của tôi thực sự có sẵn ngay cả, nhưng tôi vẫn nhận được cùng một lỗi. Bất kỳ đề xuất!
nahasapeemapetilon

12
Hãy thử lệnh "ldconfig" sau khi xuất thư viện của bạn. Bạn có thể cần phải thực thi lệnh này là "sudo".
XOR

5
Tất cả các lệnh trong bước (1) có thể được thực hiện findmột mình:find / -name the_name_of_the_file.so
wbadart

3
Tôi tin rằng LD_LIBRARY_PATHnên trỏ đến thư mục chứa path.so.something, không phải cho path.so.somethingchính nó.
gerrit

2
Làm theo lệnh của bạn từng bước giải quyết vấn đề của tôi! Cảm ơn rất nhiều!
Fisher

156

Dưới đây là một vài giải pháp bạn có thể thử:

ldconfig

Như AbiusX đã chỉ ra: Nếu bạn vừa cài đặt thư viện, bạn có thể chỉ cần chạy ldconfig .

sudo ldconfig

ldconfig tạo các liên kết và bộ đệm cần thiết cho các thư viện chia sẻ gần đây nhất được tìm thấy trong các thư mục được chỉ định trên dòng lệnh, trong tệp /etc/ld.so.conf và trong các thư mục đáng tin cậy (/ lib và / usr / lib).

Thông thường, trình quản lý gói của bạn sẽ xử lý việc này khi bạn cài đặt thư viện mới, nhưng không phải lúc nào cũng vậy và sẽ không hại khi chạy ldconfig ngay cả khi đó không phải là vấn đề của bạn.

Gói Dev hoặc phiên bản sai

Nếu điều đó không hiệu quả, tôi cũng sẽ kiểm tra đề xuất của Paul và tìm kiếm một phiên bản "-dev" của thư viện. Nhiều thư viện được chia thành các gói dev và non-dev. Bạn có thể sử dụng lệnh này để tìm kiếm nó:

apt-cache search <libraryname>

Điều này cũng có thể hữu ích nếu bạn chỉ cài đặt phiên bản sai của thư viện. Một số thư viện được xuất bản trong các phiên bản khác nhau cùng một lúc, ví dụ, Python.

Vị trí thư viện

Nếu bạn chắc chắn rằng gói đúng đã được cài đặt và ldconfig không tìm thấy gói đó, thì nó có thể nằm trong một thư mục không chuẩn. Theo mặc định, ldconfig trông vào /lib, /usr/libvà thư mục được liệt kê trong /etc/ld.so.conf$LD_LIBRARY_PATH. Nếu thư viện của bạn ở một nơi khác, bạn có thể thêm thư mục trên dòng riêng của mình vào /etc/ld.so.conf, nối thêm đường dẫn của thư viện vào $LD_LIBRARY_PATHhoặc di chuyển thư viện vào /usr/lib. Sau đó chạy ldconfig.

Để tìm ra thư viện ở đâu, hãy thử điều này:

sudo find / -iname *libraryname*.so*

(Thay thế librarynamebằng tên của thư viện của bạn)

Nếu bạn đi theo $LD_LIBRARY_PATHlộ trình, bạn sẽ muốn đưa nó vào ~/.bashrctệp của mình để nó sẽ chạy mỗi khi bạn đăng nhập:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library

3
Theo mặc định, / lib và / usr / lib nhưng không phải / usr / local / lib? Điều đó đã ném tôi đi nhiều lần trong sự nghiệp và lãng phí hàng giờ.
DarenW

@DarenW Đối với tôi làm việc với / usr / local / lib. Ubuntu 14.04 LTS.
gon132

Thêm .confcác tệp của riêng tôi với các đường dẫn lib không chuẩn mà tôi cần /etc/ld.so.conf.d(được chỉ bởi /etc/ld.so.conf) đã thực hiện thủ thuật này.
CivilFan

4
+1 vì cần chạy ldconfig. Tôi đã không sử dụng một trình quản lý gói. Tôi đã phải biên dịch từ nguồn, vì vậy điều này là cần thiết.
Jeff

7
đây là câu trả lời thực sự
Scott Stensland

53

Tôi đã có lỗi tương tự, tôi có thể giải quyết nó bằng cách đưa ra,

sudo ldconfig -v

Hi vọng điêu nay co ich.


37
Hiya, điều này có thể giải quyết vấn đề tốt ... nhưng sẽ tốt nếu bạn có thể chỉnh sửa câu trả lời của mình và cung cấp một lời giải thích nhỏ về cách thức và lý do hoạt động :) Đừng quên - có rất nhiều người mới trên Stack tràn, và họ có thể học được một hoặc hai điều từ chuyên môn của bạn - điều hiển nhiên đối với bạn có thể không đúng với họ.
Taryn East

Anh ấy sẽ không thể giải thích nó. Anh chỉ sao chép câu trả lời của mình.
Jhourlad Estrella 17/07/19

câu trả lời trùng lặp ... xem câu trả lời tương tự ở trên được tạo ra một ngày trước
Scott Stensland

25

Bạn cần đảm bảo rằng bạn chỉ định đường dẫn thư viện trong khi liên kết khi bạn biên dịch tệp .c của mình:

gcc -I / usr / local / bao gồm xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

Phần -Wl, -R cho biết nhị phân kết quả cũng tìm thư viện trong / usr / local / lib trong thời gian chạy trước khi thử sử dụng một trong / usr / lib /

Hy vọng nó sẽ giúp bạn.


3
Đây là tùy chọn tôi đang tìm kiếm. Có lẽ sẽ tốt hơn -Wl,-rpath DIR.
jrw32982 hỗ trợ Monica

1
tuyệt quá! Tôi gặp phải vấn đề đó khi chương trình của tôi được biên dịch thành công với cmake nhưng không thể bắt đầu do lỗi. Câu trả lời đó đã giải quyết vấn đề của tôi
Ivan Talalaev

15

Hãy thử thêm LD_LIBRARY_PATH, cho biết đường dẫn tìm kiếm, vào ~/.bashrctệp của bạn

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

Nó hoạt động!


13

Trang tham khảo linux.org giải thích các cơ chế, nhưng không giải thích bất kỳ động lực nào đằng sau nó :-(

Để biết điều đó, hãy xem Sun Linker và Thư viện Hướng dẫn

Ngoài ra, lưu ý rằng "phiên bản bên ngoài" phần lớn đã lỗi thời trên Linux, bởi vì phiên bản ký hiệu (phần mở rộng GNU) cho phép bạn có nhiều phiên bản không tương thích của cùng một chức năng trong một thư viện. Tiện ích mở rộng này cho phép glibc có cùng phiên bản bên ngoài: libc.so.6trong 10 năm qua.


7
cd /home/<user_name>/
sudo vi .bash_profile

thêm những dòng này ở cuối

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

5

Tôi đã gặp một lỗi tương tự và nó đã không khắc phục được khi đưa LD_LIBRARY_PATH vào ~ / .bashrc. Điều gì đã giải quyết vấn đề của tôi là bằng cách thêm tệp .conf và tải nó. Đi đến thiết bị đầu cuối được trong su.

gedit /etc/ld.so.conf.d/myapp.conf

Thêm đường dẫn thư viện của bạn trong tệp này và lưu. (Ví dụ: / usr / local / lib). Bạn phải chạy lệnh sau để kích hoạt đường dẫn:

ldconfig

Xác minh đường dẫn thư viện mới của bạn:

ldconfig -v | less

Nếu điều này hiển thị các tập tin thư viện của bạn, thì bạn tốt để đi.


4

Một giải pháp khác có thể tùy thuộc vào tình huống của bạn.

Nếu bạn biết rằng libpthread_rt.so.1 giống như libpthread_rt.so thì bạn có thể tạo một liên kết tượng trưng bằng cách:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

Sau đó, ls -l /libbây giờ sẽ hiển thị các liên kết tượng trưng và những gì nó trỏ đến.


4

Tôi đã gặp lỗi này khi chạy ứng dụng của mình với Eclipse CDT trên Linux x86.
Để khắc phục điều này:

  1. Trong Nhật thực:

    Chạy dưới dạng -> Chạy cấu hình -> Môi trường

  2. Đặt đường dẫn

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

Tất cả tôi phải làm là chạy:

sudo apt-get install libfontconfig1

Tôi đã ở trong thư mục nằm ở /usr/lib/x86_64-linux-gnuvà nó hoạt động hoàn hảo.


2

Nếu bạn đang chạy ứng dụng của mình trên Microsoft Windows, đường dẫn đến thư viện động (dll) cần được xác định trong biến môi trường PATH.

Nếu bạn đang chạy ứng dụng của mình trên UNIX, đường dẫn đến các thư viện động (.so) của bạn cần được xác định trong biến môi trường LD_LIBRARY_PATH.


1

hãy thử cài đặt sudo lib32z1

sudo apt-get cài đặt lib32z1


1

Lỗi xảy ra do hệ thống không thể tham chiếu đến tệp thư viện được đề cập. Thực hiện các bước sau:

  1. Chạy locate libpthread_rt.so.1sẽ liệt kê đường dẫn của tất cả các tệp có tên đó. Hãy giả sử một con đường là /home/user/loc.
  2. Sao chép đường dẫn và chạy cd home/USERNAME . Thay thế USERNAME bằng tên của người dùng đang hoạt động hiện tại mà bạn muốn chạy tệp.
  3. Chạy vi .bash_profilevà ở cuối LD_LIBRARY_PATHtham số, ngay trước đó ., thêm dòng/lib://home/usr/loc:. . Lưu các tập tin.
  4. Đóng thiết bị đầu cuối và khởi động lại ứng dụng. Nó nên chạy.

0

Tôi đã gặp lỗi này và tôi nghĩ đó là lý do tương tự của bạn

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

Thử cái này. Sửa quyền trên tệp:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

Ngay lập tức để có quyền trên hệ thống tập tin của bạn.


0

Tôi đã gặp lỗi này và tôi nghĩ đó là lý do tương tự của bạn

lỗi trong khi tải thư viện dùng chung: libnw.so: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy

Thử cái này. Sửa quyền trên tệp:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 

0

vấn đề tương tự được tìm thấy ở đây: https://ormszilla.redhat.com/show_orms.cgi?id=1456202 Tôi đã thử giải pháp được đề cập và nó thực sự hoạt động.

Các giải pháp trong các câu hỏi trước có thể làm việc. Nhưng tôi nghĩ rằng đây là một cách dễ dàng để khắc phục nó. Hãy thử cài đặt lại gói libwbclient trong fedora:

dnf reinstall libwbclient

0

Tôi sử dụng Ubuntu 18.04

Cài đặt gói "-dev" tương ứng làm việc cho tôi,

sudo apt install libgconf2-dev

Tôi đã nhận được lỗi dưới đây cho đến khi tôi cài đặt gói trên,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
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.