Сбой привязки Boost

У меня есть следующий код, который я пытаюсь скомпилировать:

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

Моя библиотека boost находится в /home/foo/include. и включаемые файлы на самом деле там.

когда я запускаю следующее:

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

Я получаю следующую ошибку. как я могу решить это. чему я должен следовать?

/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

ИЗМЕНИТЬ:

Теперь я попробовал:

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

и получите следующую ошибку:

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

У меня есть libboost_system-gcc34-1_38.so внутри

/home/foo/lib

как я могу указать на это?


person DarthVader    schedule 09.11.2011    source источник
comment
Я добавил ответ здесь. Ответы ниже не сработали для меня, хотя они могут достигать того же, что и я.   -  person user984260    schedule 01.03.2016


Ответы (4)


со страницы руководства gcc:

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

Итак, вам не хватает -L/home/foo/lib в командной строке?

Ваш код правильно скомпилирован на моей Linux-машине (Ubuntu 10.04, boost-filesystem 1.40) с помощью следующей команды:

g++ test.cpp -lboost_filesystem

or

g++ test.cpp -lboost_system -lboost_filesystem

Это дало мне ошибки компиляции с g++ test.cpp -lboost_system

person suresh    schedule 09.11.2011
comment
boost_filesystem.so имеет автозапуск на boost_system.so? Мне нужно rtfm чаще. - person moshbear; 09.11.2011

Вы также должны сообщить компилятору/компоновщику, где находятся ваши библиотеки, если они не находятся в расположении по умолчанию. Для этого вы должны использовать флаг -L для компилятора:

g++ -I/home/y/include/ test.cc -L/home/foo/lib -lboost_system -lboost_filesystem
person Some programmer dude    schedule 09.11.2011

Добавьте -lboost_system (-lboost_system-mt, если вы собираетесь использовать потоки) и -lboost_filesystem (-lboost_filesystem-mt, если вы собираетесь использовать потоки) в командную строку перед любыми входными файлами.

person moshbear    schedule 09.11.2011
comment
Я получаю это сейчас: /usr/bin/ld: не могу найти -lboost_system collect2: ld вернул 1 статус выхода. У меня есть libboost_system-gcc34-1_38.so в /home/foo/lib. я могу это использовать? как я могу связать это? - person DarthVader; 09.11.2011
comment
Добавьте -L/home/foo/lib перед lboost_.... - person moshbear; 09.11.2011

Похоже, что ваши библиотеки Boost имеют суффикс gcc34-1_38. Вы используете gcc 3.4? Ваша библиотека boost находится на пути к библиотеке? Если нет, вам может потребоваться добавить путь к вашим библиотекам boost, используя флаг -L для g++, или вы можете добавить путь к переменной среды LD_LIBRARY_PATH. В любом случае вы можете ссылаться на свои библиотеки повышения, используя -lboost_system-gcc34-1_38 и -lboost_filesystem-gcc34-1_38.

person Sean    schedule 09.11.2011