2011-11-09 47 views
6

Tôi có đoạn code sau đây mà tôi đang cố gắng để biên dịch:Boost nối thất bại

#include <boost/filesystem/convenience.hpp> 
#include <boost/foreach.hpp> 
#include <boost/range.hpp> 
#include <iostream> 

int main(int, char**) 
{ 
    namespace bf = boost::filesystem; 
    BOOST_FOREACH(bf::path path, 
      boost::make_iterator_range(
       bf::recursive_directory_iterator(bf::path("/home")), 
       bf::recursive_directory_iterator())) { 
     std::cout << path.string() << std::endl; 
    } 
    return 0; 
} 

thư viện boost của tôi là trong/home/foo/include. và các tệp bao gồm thực sự ở đó.

khi tôi chạy như sau:

g++ -I/home/foo/include/ test.cc 

tôi nhận được lỗi sau. làm thế nào tôi có thể giải quyết điều này. tôi nên làm gì đây?

/tmp/ccvDmFNL.o(.text+0x502): In function `__static_initialization_and_destruction_0(int, int)': 
: undefined reference to `boost::system::get_system_category()' 
/tmp/ccvDmFNL.o(.text+0x51b): In function `__static_initialization_and_destruction_0(int, int)': 
: undefined reference to `boost::system::get_generic_category()' 
/tmp/ccvDmFNL.o(.text+0x534): In function `__static_initialization_and_destruction_0(int, int)': 
: undefined reference to `boost::system::get_generic_category()' 
/tmp/ccvDmFNL.o(.text+0x54d): In function `__static_initialization_and_destruction_0(int, int)': 
: undefined reference to `boost::system::get_generic_category()' 
/tmp/ccvDmFNL.o(.text+0x566): In function `__static_initialization_and_destruction_0(int, int)': 
: undefined reference to `boost::system::get_system_category()' 
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem24basic_directory_iteratorINS0_10basic_pathISsNS0_11path_traitsEEEE6m_initERKS4_+0x2e): In function `boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::m_init(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)': 
: undefined reference to `boost::filesystem::detail::not_found_error()' 
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem24basic_directory_iteratorINS0_10basic_pathISsNS0_11path_traitsEEEE6m_initERKS4_+0xbe): In function `boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::m_init(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)': 
: undefined reference to `boost::filesystem::detail::dir_itr_first(void*&, void*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::filesystem::file_status&, boost::filesystem::file_status&)' 
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost6system10error_codeC1Ev+0x14): In function `boost::system::error_code::error_code()': 
: undefined reference to `boost::system::get_system_category()' 
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem24basic_directory_iteratorINS0_10basic_pathISsNS0_11path_traitsEEEE9incrementEv+0xde): In function `boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::increment()': 
: undefined reference to `boost::filesystem::detail::dir_itr_increment(void*&, void*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::filesystem::file_status&, boost::filesystem::file_status&)' 
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem6statusINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EENS0_11file_statusEE4typeERKS7_+0x34): In function `boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, boost::filesystem::file_status>::type boost::filesystem::status<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)': 
: undefined reference to `boost::filesystem::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::system::error_code&)' 
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem6detail11dir_itr_impINS0_10basic_pathISsNS0_11path_traitsEEEED1Ev+0x1d): In function `boost::filesystem::detail::dir_itr_imp<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::~dir_itr_imp()': 
: undefined reference to `boost::filesystem::detail::dir_itr_close(void*&, void*&)' 
collect2: ld returned 1 exit status 

EDIT:

Bây giờ tôi đã cố gắng:

g++ -I/home/foo/include/ test.cc -lboost_system -lboost_filesystem 

và nhận được lỗi sau:

/usr/bin/ld: cannot find -lboost_system 
collect2: ld returned 1 exit status 

Tôi có libboost_system-gcc34-1_38.so trong vòng

/home/foo/lib 

làm cách nào tôi có thể trỏ đến điều đó?

+0

tôi đã thêm một câu trả lời [ở đây] (http://stackoverflow.com/a/35732953/984260). Các câu trả lời dưới đây không hiệu quả với tôi, mặc dù họ có thể đạt được điều tương tự mà tôi đã làm. – user984260

Trả lời

11

từ trang man gcc:

-Ldir Add directory dir to the list of directories to be searched for -l.

Vì vậy, nó là rằng bạn đang thiếu -L/home/foo/lib vào dòng lệnh?

Mã của bạn biên soạn đúng trên máy linux của tôi (Ubuntu 10.04, tăng-hệ thống tập tin 1.40) với lệnh sau đây:

g++ test.cpp -lboost_filesystem

hoặc

g++ test.cpp -lboost_system -lboost_filesystem

Nó đã cho tôi biên dịch lỗi với g++ test.cpp -lboost_system

+0

'boost_filesystem.so' có tự động xóa trên' boost_system.so'? Tôi cần phải rtfm thường xuyên hơn. – moshbear

1

Thêm -lboost_system (-lboost_system-mt nếu bạn sắp được tạo luồng) và -lboost_filesystem (-lboost_filesystem-mt nếu bạn sắp đọc luồng) vào cmdline, trước bất kỳ tệp nhập nào.

+0

Tôi nhận được thông báo này ngay bây giờ:/usr/bin/ld: không thể tìm thấy -lboost_system collect2: ld trả về 1 trạng thái thoát. Tôi có libboost_system-gcc34-1_38.so trong/home/foo/lib. tôi có thể dùng nó không làm thế nào tôi có thể liên kết với điều đó? – DarthVader

+1

Thêm '-L/home/foo/lib' trước' lboost _... '. – moshbear

1

Thư viện tăng cường của bạn dường như được trang trí với hậu tố gcc34-1_38. Bạn đang sử dụng gcc 3.4? Là thư viện tăng cường của bạn trên đường dẫn thư viện? Nếu không, bạn có thể cần thêm đường dẫn vào thư viện tăng của mình bằng cách sử dụng cờ -L thành g ++ hoặc bạn có thể thêm đường dẫn đến biến môi trường LD_LIBRARY_PATH. Trong mọi trường hợp, bạn có thể liên kết tới thư viện tăng cường của mình bằng cách sử dụng -lboost_system-gcc34-1_38-lboost_filesystem-gcc34-1_38.

2

Bạn phải nói trình biên dịch/trình liên kết nơi thư viện là tốt, nếu chúng không ở vị trí mặc định. Đối với điều này bạn phải sử dụng -L cờ để trình biên dịch:

g++ -I/home/y/include/ test.cc -L/home/foo/lib -lboost_system -lboost_filesystem