2010-11-02 31 views
8

Tôi đã viết một chương trình nhỏ yêu cầu một số thư viện bao gồm libboost_filesystem, libboost_program_options và libcurl.Chương trình biên dịch C++ tăng "không thể mở tệp đối tượng được chia sẻ" trên hệ thống khác mặc dù tệp hiện tại là

Tôi đã biên dịch nó trên máy tính ở nhà và lấy mã nhị phân vào máy tính của tôi tại nơi làm việc để kiểm tra ở đó. Nhưng có nó mang lại cho các thông báo lỗi sau khi tôi cố gắng để bắt đầu chương trình:

error while loading shared libraries: 
libboost_filesystem.so.1.42.0: cannot 
open shared object file 

nhưng khi tôi tìm kiếm tập tin này, tôi thấy rằng nó tồn tại trong: /usr/lib/libboost_filesystem.so.1.42.0

Tôi có vấn đề gì trong quá trình biên dịch/liên kết chương trình của mình không? Nếu có thì tôi phải làm gì để làm cho nó hoạt động trên các máy khác?

+1

Tôi thường thấy rằng 'ldd' có thể giúp tôi tìm hiểu điều gì sai. 'Ldd./Your_executable' có nghĩa là gì? –

+1

Từ những gì bạn đã nói, có vẻ như nó sẽ hoạt động. Có thể có xung đột 32 bit so với 64 bit. Hãy thử chạy 'file./Your_executable' và' file/usr/lib/libboost_filesystem.so.1.42.0' để kiểm tra xem các kiến ​​trúc có phù hợp không :) –

+1

wow bạn nói đúng. chương trình được xây dựng như 32bit và thư viện hiện tại là 64bit – tyrondis

Trả lời

1

Bạn đã biên dịch các tệp nhị phân được chia sẻ tăng và cung cấp chúng cho người dùng chưa?

Thường xuyên tăng cường có thể được sử dụng mà không có bất kỳ nhị phân/chia sẻ nào để cung cấp. Nhưng nếu bạn sử dụng, ví dụ: boost :: filesystem, bạn sẽ phải xây dựng các tệp nhị phân, dưới dạng đối tượng lib hoặc được chia sẻ và đảm bảo nó có sẵn cho đường dẫn tìm kiếm nhị phân có thể thực thi cuối cùng.

Bạn có thể tìm giải thích và biết thêm chi tiết trong tài liệu tăng cường. Đây là phiên bản Linux: http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html

Từ trang này:

Hầu hết các thư viện Boost được tiêu đề chỉ: họ bao gồm toàn bộ các tập tin tiêu đề mẫu chứa và inline chức năng, và không cần separately- biên dịch thư viện nhị phân hoặc điều trị đặc biệt khi liên kết.

...

Các thư viện Boost duy nhất mà phải xây dựng riêng biệt là:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python (xem các Boost.Python xây dựng tài liệu hướng dẫn trước khi xây dựng và cài đặt nó)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost. Hệ thống
  • Boost.Thread
  • Boost.Wave
+0

Bạn có thể giải thích điều này với nhiều chi tiết hơn không? Hoặc dẫn tôi đến một số tài nguyên? Tôi khá mới để phát triển linux và không biết nhiều về nó. – tyrondis

+0

Tôi đang thêm liên kết đến tài liệu chính xác hơn về điều đó. Làm xong. – Klaim

1

Có vẻ như bạn cần phải liên kết tĩnh thư viện. Đây là một lời giải thích tốt.Boost static linking

+1

ok nhưng nếu tôi liên kết chúng tĩnh sẽ không mất lợi ích của việc có phụ thuộc vào thư viện được chia sẻ? Tôi nghĩ rằng sẽ là "tiêu chuẩn" cách dưới Linux – tyrondis

1

Bạn có liên kết với cùng một phiên bản của thư viện hệ thống boost_files không? Tùy thuộc vào cách bạn biên dịch ứng dụng của bạn, nó yêu cầu phiên bản thư viện rất giống nhau.

Bạn có thể thử để kiểm tra những gì ứng dụng của bạn thực sự tìm kiếm với:

ldd <your app name> 

lẽ kiểm tra biến môi trường LD_LIBRARY_PATH của bạn là tốt.

+0

lld đã cho tôi \t libboost_filesystem.so.1.42.0 => không tìm thấy \t libboost_program_options.so.1.42.0 => không tìm thấy \t libboost_system.so.1.42. 0 => không tìm thấy – tyrondis

1

Bạn có chắc chắn rằng /usr/lib/libboost_filesystem.so.1.42.0 không phải là liên kết đã chết không?

7

Trước tiên, hãy thử phát hành ldconfig -p | grep libboost_filesystem.so trong bảng điều khiển để đảm bảo thư viện nằm trong bộ nhớ cache ld của bạn.

Nếu nó không phải là, bạn có thể cần phải thêm một tập tin với một tên như boost.conf để /etc/ld.so.conf.d thư mục của bạn. Tệp này phải chứa đường dẫn đến thư viện tăng của bạn. Sau đó, chạy sudo ldconfig để cập nhật bộ nhớ cache ld của hệ thống của bạn.

Hy vọng điều này sẽ giúp ...

+1

thx, có vẻ là một cách hay để làm điều đó. Có lẽ tiêu chuẩn? – unludo

1

là/usr/lib trong biến môi trường LD_LIBRARY_PATH của bạn?

Các vấn đề liên quan