2011-01-03 35 views
19

Tôi đang xây dựng một tệp C++ trên Linux. Các liên kết thực thi vào một số thư viện tăng cường.lỗi khi tải thư viện được chia sẻ: libboost_system.so.1.45.0: không thể mở tệp đối tượng được chia sẻ: Không có tệp hoặc thư mục nào như vậy

Đây là đầu ra khi tôi cố gắng để chạy nhị phân:

[email protected]:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ./testfgci 
./testfgci: error while loading shared libraries: libboost_system.so.1.45.0: cannot open shared object file: No such file or directory 

sau đó tôi chạy ldd trên nhị phân để kiểm tra phụ thuộc:

[email protected]:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ldd testfgci 
    linux-gate.so.1 => (0x00380000) 
    libboost_system.so.1.45.0 => not found 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00b50000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x005f6000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0099a000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x001b3000) 
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00110000) 
    /lib/ld-linux.so.2 (0x00ea2000) 

Tôi không chắc chắn lý do tại sao liboos_system.sl Không tìm thấy .1.45.0 SO. Tôi đã xây dựng nó thành công sớm hơn một chút vào ngày hôm nay. Bất cứ ai có thể giải thích?

+0

Có thể là khi xây dựng, bạn đang đi qua những lá cờ để trình biên dịch cho các thư viện liên kết bổ sung, nhưng khi bạn muốn chạy chương trình, các thư viện Boost don' t tồn tại trong các đường dẫn linker. Có thể trùng lặp [liên kết vấn đề trong thư viện] (http://stackoverflow.com/questions/4568187/linking-problem-in-libraries) – birryree

+1

Tôi đã tìm thấy câu trả lời. Tôi đã phải thêm đường dẫn đến LD_LIBRARY_PATH của tôi và sau đó xuất nó. Mã nhị phân chạy, nhưng báo cáo lỗi (Hệ thống lỗi: 9: Bộ mô tả tệp không hợp lệ).Tôi sẽ phải hoặc là am hiểu câu hỏi này để phản ánh điều đó, hoặc hỏi một câu hỏi mới – skyeagle

Trả lời

21

Không thể tìm thấy thư viện.

Thư viện theo mặc định được tìm kiếm trong /lib, /usr/lib và các thư mục được chỉ định bởi /etc/ld.so.conf.

Thông thường thư viện hệ thống (như tăng cường, nếu bạn đã cài đặt thư viện thông qua trình quản lý gói) nằm ở /usr/lib, nhưng có thể không phải trường hợp của bạn.

Thư viện tăng cường của bạn nằm ở đâu trên hệ thống của bạn? Bạn đã tự biên dịch chúng? Trong trường hợp này, bạn nên nói với các mối liên kết động để tìm kiếm các thư viện của bạn trong thư mục mà họ đang xác định bằng cách sử dụng biến LD_LIBRARY_PATH môi trường:

LD_LIBRARY_PATH="your/boost/directory" ./testfgci 

tôi muốn đề nghị bạn cài đặt thư viện tăng sử dụng quản lý gói của bạn, dù sao , điều này sẽ làm cho cuộc sống của bạn đơn giản hơn rất nhiều.

15

Tôi biết rằng đây là phiên bản cũ nhưng bạn có thể chạy ldconfig để tạo lại bộ nhớ cache ld của mình. Bằng cách đó bạn không cần phải cập nhật LD_LIBRARY_PATH.

+1

Cảm ơn bạn rất nhiều !!! – expert

3

Tôi chỉ muốn thêm ghi chú cho người dùng Ubuntu (và Debian, tôi đoán): các hệ thống này có tính năng bảo mật "xóa" LD_LIBRARY_PATH. này không hoạt động:

Trong cả hai /etc/environemnt hoặc ~/.profile hoặc ~/.bash_profile:

export LD_LIBRARY_PATH=/usr/local/boost_1_54_0/stage/lib:$LD_LIBRARY_PATH 

Nó sẽ làm việc cho ~/.bashrc, nhưng con đường sẽ được thiết lập chỉ cho riêng vỏ tương tác này. Điều này có nghĩa là nếu bạn gọi make từ ví dụ: emacs hoặc eclipse, nó sẽ không hoạt động, trừ khi bạn đã khởi chạy emacs từ trình bao chứ không phải từ trình khởi chạy.

Đây là những gì làm việc cho tôi:

echo -e "\n/usr/local/boost_1_54_0/stage/lib" | sudo tee -a /etc/ld.so.conf 
sudo ldconfig 
Các vấn đề liên quan