2010-07-28 44 views
15

Tôi đang cố biên dịch multiple_sources.cpp để biên dịch trên máy tính của mình. Tôi đang chạy Xubuntu Lucid Lynx cập nhật đầy đủ.Không thể tìm thấy thư viện C++ khi liên kết, lỗi khi biên dịch ví dụ `boost :: program_options`

Nó sẽ biên dịch mà không vấn đề với g++ -c multiple_sources.cpp nhưng khi tôi cố gắng liên kết và thực hiện một exectuable với g++ multiple_sources.o tôi nhận được:

multiple_sources.cpp:(.text+0x3d): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x87): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
multiple_sources.cpp:(.text+0x15a): undefined reference to `boost::program_options::options_description::add_options()' 
multiple_sources.cpp:(.text+0x17b): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x193): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x1af): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)' 
multiple_sources.cpp:(.text+0x1eb): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x252): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
... 

vân vân quảng cáo nauseum.

tôi có thư viện cài đặt:

>ls -l /usr/lib/libboost_program_options* 
-rw-r--r-- 1 root root 640800 2010-03-31 21:19 /usr/lib/libboost_program_options.a 
lrwxrwxrwx 1 root root  26 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.a  -> libboost_program_options.a 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.so -> libboost_program_options.so.1.40.0 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options.so -> libboost_program_options.so.1.40.0 
-rw-r--r-- 1 root root 289336 2010-03-31 21:19 /usr/lib/libboost_program_options.so.1.40.0 

Sau khi đọc man page g ++, tôi cũng đã cố gắng:

  • g++ -llibboost_program_options multiple_sources.cpp
  • g++ -llibboost_program_options.a multiple_sources.cpp
  • g++ -llibboost_program_options.so multiple_sources.cpp
  • và tất cả ở trên với -L/usr/libtrước các -l

Tất cả họ đều thất bại với một biến thể:

/usr/bin/ld: cannot find -llibboost_program_options.so 
collect2: ld returned 1 exit status 

Tôi đang làm gì sai?

Trả lời

24

Thông số -l sai; loại bỏ lib trước khi sửa chữa và sử dụng -lboost_program_options.

Trình liên kết dự kiến ​​tất cả các thư viện sẽ bắt đầu bằng lib và để bạn thoát khỏi khi chỉ định thư viện.

Bạn cũng có thể bao gồm đường dẫn đầy đủ vào thư viện trong danh sách tệp, không có -l (ví dụ: g++ multiple_sources.cpp /usr/lib/libboost_program_options.so), nhưng đối với thư viện hệ thống, tốt hơn là theo quy ước; chúng không phải lúc nào cũng được cài đặt trong /usr/lib.

+2

Đúng vậy. Nhầm lẫn, trình liên kết mong đợi tất cả các thư viện bắt đầu bằng 'lib', và để bạn rời khỏi nó khi chỉ định thư viện. –

+0

@Mike Cảm ơn bạn! Tôi vừa mới hỏi tại sao lại thế. Điều này là bắt buộc phải không? Có cách nào đó để ghi đè điều đó không? Bây giờ tôi đã tò mò hỏi. – ArtB

+1

@ArtB: Tôi nghĩ bạn cũng có thể đưa đường dẫn đầy đủ vào thư viện trong danh sách tệp, không có '-l' (ví dụ:' g ++ multiple_sources.cpp/usr/lib/libboost_program_options.so'). Nhưng đối với các thư viện hệ thống thì tốt hơn là theo quy ước; chúng không phải lúc nào cũng được cài đặt trong '/ usr/lib'. –

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