2011-11-09 17 views
6

Mam następujący kod, który ja próbuję skompilować:doładowania powiązanie nie

#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; 
} 

Moje doładowania biblioteka znajduje się w/home/foo/include. i pliki dołączane są w rzeczywistości.

kiedy uruchomić następujące:

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

otrzymuję następujący błąd. jak mogę to rozwiązać. co mam naśladować?

/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:

Teraz próbowałem:

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

i pojawia się następujący błąd:

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

mam libboost_system-gcc34-1_38.so zasięgu

/home/foo/lib 

Jak mogę to wskazać?

+0

dodałem odpowiedź [tutaj] (http://stackoverflow.com/a/35732953/984260). Poniższe odpowiedzi mi nie pomogły, chociaż mogą osiągnąć to samo co ja. – user984260

Odpowiedz

11

strony man gcc:

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

Tak, jest to, że brakuje -L/home/foo/lib do wiersza poleceń?

Twój kod skompilowany poprawnie na moim komputerze Linux (Ubuntu 10.04, boost-plików 1.40) za pomocą następującego polecenia:

g++ test.cpp -lboost_filesystem

lub

g++ test.cpp -lboost_system -lboost_filesystem

To dało mi błędy kompilacji z g++ test.cpp -lboost_system

+0

'boost_filesystem.so' ma autowykład na' boost_system.so'? Muszę częściej sprawdzać rtfm. – moshbear

1

Dodaj -lboost_system (-lboost_system-mt jeśli masz zamiar być gwintowania) i -lboost_filesystem (-lboost_filesystem-mt jeśli masz zamiar być gwintowania) do CMDLINE przed wszelkimi plików wejściowych.

+0

Otrzymuję to teraz:/usr/bin/ld: nie można znaleźć -lboost_system collect2: ld zwrócił 1 status wyjścia. Mam libboost_system-gcc34-1_38.so w/home/foo/lib. Czy mogę tego użyć? jak mogę połączyć z tym? – DarthVader

+1

Dodaj '-L/home/foo/lib' przed' lboost _... '. – moshbear

1

Twoje biblioteki boost wydają się być ozdobione przyrostkiem gcc34-1_38. Czy używasz gcc 3.4? Czy twoja biblioteka boost znajduje się na ścieżce biblioteki? Jeśli nie, możesz dodać ścieżkę do bibliotek boost przy użyciu flagi -L do g ++ lub możesz dodać ścieżkę do zmiennej środowiskowej LD_LIBRARY_PATH. W każdym razie możesz połączyć się z bibliotekami boost przy użyciu -lboost_system-gcc34-1_38 i -lboost_filesystem-gcc34-1_38.

2

Musisz poinformować kompilator/linker, gdzie biblioteki również, jeśli nie znajdują się w domyślnej lokalizacji. W tym celu należy użyć flagi -L do kompilatora:

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