Компиляция исходного файла C++ с использованием Boost.Thread

Я пытаюсь научиться использовать библиотеку С++ Boost.Thread. Я установил библиотеки Boost в свою систему Ubuntu 11.10. Я следую книге Шалинга «Библиотеки Boost C++», в частности, примеру 6.1 на странице 66. Я пытаюсь скомпилировать следующий пример кода:

#include <boost/thread.hpp>
#include <iostream>

void wait(int seconds)
{ 
  boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}

void thread()
{
  for(int i = 0; i < 5; ++i)
  {
    wait(1);
    std::cout << i << std::endl;
  }
}

int main() 
{
  boost::thread t(thread);
  t.join();
}

Однако, когда я компилирую это со следующим из командной строки:

$ g++ example61.cpp -o example61 -I /usr/local/include

Я получаю следующий вывод:

/tmp/cc6bVu1F.o: In function `main':
example6.cpp:(.text+0x9d): undefined reference to `boost::thread::join()'
example6.cpp:(.text+0xae): undefined reference to `boost::thread::~thread()'
example6.cpp:(.text+0xc6): undefined reference to `boost::thread::~thread()'
/tmp/cc6bVu1F.o: In function `boost::detail::thread_data_base::thread_data_base()':
example6.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[_ZN5boost6detail16thread_data_baseC5Ev]+0x24): undefined reference to `vtable for boost::detail::thread_data_base'
/tmp/cc6bVu1F.o: In function `void boost::this_thread::sleep<boost::posix_time::seconds>(boost::posix_time::seconds const&)':
example6.cpp:(.text._ZN5boost11this_thread5sleepINS_10posix_time7secondsEEEvRKT_[void boost::this_thread::sleep<boost::posix_time::seconds>(boost::posix_time::seconds const&)]+0x35): undefined reference to `boost::this_thread::sleep(boost::posix_time::ptime const&)'
/tmp/cc6bVu1F.o: In function `boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)':
example6.cpp:(.text._ZN5boost6threadC2IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE[_ZN5boost6threadC5IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE]+0x30): undefined reference to `boost::thread::start_thread()'
/tmp/cc6bVu1F.o: In function `boost::detail::thread_data<void (*)()>::~thread_data()':
example6.cpp:(.text._ZN5boost6detail11thread_dataIPFvvEED2Ev[_ZN5boost6detail11thread_dataIPFvvEED5Ev]+0x1f): undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
/tmp/cc6bVu1F.o:(.rodata._ZTIN5boost6detail11thread_dataIPFvvEEE[typeinfo for boost::detail::thread_data<void (*)()>]+0x10): undefined reference to `typeinfo for boost::detail::thread_data_base'
collect2: ld returned 1 exit status

Я не знаю, как это интерпретировать. Кто-нибудь может помочь? Большое спасибо!


person TJB    schedule 28.10.2011    source источник
comment
Вы должны связать с библиотекой потоков Boost   -  person Violet Giraffe    schedule 29.10.2011
comment
@ Violet Giraffe, можешь помочь, как мне это сделать? Спасибо!   -  person TJB    schedule 29.10.2011
comment
Вы сами собирали библиотеки Boost? Это очень трудный способ сделать это. На вашем месте я бы удалил все, что вы установили из /usr/local/include и /usr/local/lib, и apt-get install libboost-thread-dev   -  person Zan Lynx    schedule 29.10.2011
comment
@Zan Lynx, изначально я так и сделал. Но пакеты Ubuntu предназначены для версии 1.46, а в книге, которую я читаю, используется версия 1.47. Я хотел иметь ту же версию. Должен ли я просто использовать более простой способ установки и беспокоиться о различиях позже? Спасибо за совет!   -  person TJB    schedule 29.10.2011
comment
@TJB: Некоторые из ваших проблем вызваны установкой в ​​необычный каталог. Но если вы хотите сохранить его, следующее, что вам нужно сделать, это добавить /usr/local/lib в каталоги поиска вашей общей библиотеки.   -  person Zan Lynx    schedule 29.10.2011
comment
@ZanLynx: хорошо. Как вы понимаете, я немного новичок. В книге упоминается /usr/local. Какое место более характерно? Большое спасибо за совет.   -  person TJB    schedule 29.10.2011


Ответы (5)


Это ошибка связывания. Это означает, что ваш код правильный и вы включаете правильные заголовки, но компилятор не связывается с библиотекой потоков Boost. Чтобы исправить это, вам нужно скомпилировать так:

g++ example61.cpp -o example61 -I /usr/local/include -lboost_thread

Если вы установили библиотеку потоков Boost по нестандартному пути, вы также должны добавить ее в путь поиска:

g++ example61.cpp -o example61 -I /usr/local/include -lboost_thread -L/usr/local/lib
person Antti    schedule 28.10.2011
comment
@ Антии, это почти работает. Он компилируется в любом случае. Но когда я запускаю его, я получаю следующее: ./example6: ошибка при загрузке общих библиотек: libboost_thread.so.1.47.0: невозможно открыть общий объектный файл: нет такого файла или каталога - person TJB; 29.10.2011
comment
Вам нужно передать путь к библиотеке, чтобы ее можно было найти во время выполнения: LD_LIBRARY_PATH=/usr/local/lib ./example6 - person Antti; 29.10.2011
comment
Спасибо за помощь. Это сработало. Это нестандартный путь для Boost? В документации предлагается /usr/local. Где я должен поставить его на Ubuntu? Большое спасибо! - person TJB; 31.10.2011
comment
/usr/local — это общий путь для хранения материалов, которые вы установили самостоятельно, но обычно он не входит в стандартный путь поиска компилятора. Поместить туда boost — это нормально, но обычно вы устанавливаете Boost из репозитория Ubuntu, и в этом случае он будет установлен в /usr (и будет автоматически найден компилятором). - person Antti; 31.10.2011
comment
Спасибо за помощь. Я действительно ценю это. - person TJB; 31.10.2011
comment
Я обнаружил, что мне также нужно добавить -lboost_system. - person Vignesh; 20.12.2017

Вам нужно подключиться к библиотеке. Некоторые библиотеки Boost полностью реализованы в заголовочных файлах и не нуждаются в библиотеке. Но другие, такие как thread, реализованы частично в заголовках и частично в коде скомпилированной библиотеки.

Я считаю, что вам нужно добавить -lboost_thread-mt к вашей команде компиляции.

person Zan Lynx    schedule 28.10.2011

Boost thread - это не только библиотека шаблонов. Вам нужно добавить -lboost_thread при компоновке/компиляции.

Большинство библиотек в boost реализованы в заголовках. Их можно просто включить, как вы это сделали. Поток Boost, с другой стороны, имеет такую ​​природу, что вам нужно зависеть от его скомпилированных модулей, только объявление его функции доступно для вас в заголовке. Так что компилятор, а точнее компоновщик, который отвечает за привязку ваших вызовов к объявленным функциям/классам, должен знать, где искать эти символы. Вызывая компилятор с параметром -lboost_thread, вы указываете ему связать библиотечный (-l) поток повышения.

person daramarak    schedule 28.10.2011

После ваших комментариев я делюсь с вами строкой компиляции для инструмента компиляции pocketcpp:

g++ -static -I"\boost" "$(FULL_CURRENT_PATH)" -L"\MinGW\lib" -lboost_thread -lboost_system -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe"

Удачи,

person user3244035    schedule 28.01.2014

Я прокомментировал выше, но хотел поделиться полной командной строкой здесь.

g++ -std=c++11 thread_example.cpp -lboost_thread -lboost_system

[Я использую thread_example.cpp в качестве имени исходного файла; пожалуйста, замените на свой]

person Vignesh    schedule 20.12.2017