Boost Thread Destructor Неопределенный символ

Я использую OS X Mountain Lion. Я только что скачал, распаковал и собрал boost 1.52.0, следуя инструкциям, предоставленным на веб-сайте boost: http://www.boost.org/doc/libs/1_52_0/more/getting_started/unix-variants.html. Я оставил префикс установки по умолчанию /usr/local, что означает, что библиотеки устанавливаются в /usr/local/lib, а заголовочные файлы — в /usr/local/include. Я проверил, что библиотеки и заголовки присутствуют там и недавно изменены.

Я пытаюсь скомпилировать приведенный здесь пример асинхронного ввода-вывода boost: http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/tutorial/tuttimer5/src.html (источник).

Вот моя команда компиляции:

g++ -Wall -c -g -I/usr/local/include src/test1.cpp -o src/test1.o

где src/test1.cpp — исходный файл примера. Вот моя команда связывания (и ошибка):

g++ -Wall -L/usr/local/lib -lboost_thread -lboost_system  src/test1.o -o bin/test1
Undefined symbols for architecture x86_64:
  "boost::thread::~thread()", referenced from:
      _main in test1.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Я пробовал использовать как clang++ 4.0 от Apple, так и g++ 4.6.0. Я получаю ту же ошибку неопределенного символа из обеих программ.

Похоже, у других людей тоже возникли проблемы с компиляцией этого примера кода. Мне известен этот вопрос: C++/Boost: неопределенные символы в примере? и этот: Ошибка компоновщика при компиляции примера boost.asio. Однако каждая из этих проблем, кажется, была устранена путем добавления соответствующих ключей (-lboost_thread и -lboost_system) в командную строку. У меня уже есть такие. Я также безуспешно пытался добавить -lpthread.

Спасибо, что нашли время, чтобы посмотреть на мой вопрос! Любая помощь приветствуется. :)


person larskholte    schedule 12.12.2012    source источник


Ответы (2)


Только что столкнулся с этой же проблемой, и я обнаружил, что возврат к Boost 1.49 решает проблему. Ссылки для скачивания Boost 1.49 находятся здесь:

http://www.boost.org/users/history/version/usr/local/include/boost49_0.html

Перед установкой 1.49 я удалил 1.52, удалив /usr/local/include/boost и /usr/local/lib/*boost*. Не уверен, что изменилось между 1.49 и 1.52, чтобы вызвать эту проблему, и будет ли работать Boost 1.50 или 1.51.

person msridhar    schedule 02.01.2013

Поместите библиотеки, которые вы связываете с last, в командную строку.

Компоновщик GNU использует своего рода обратный просмотр зависимостей, поэтому, если файл A зависит от библиотеки B, B должен стоять после A в командной строке.

person Some programmer dude    schedule 12.12.2012
comment
Спасибо за отзыв. Я переместил библиотеки в конец команды компоновщика и переупорядочил их (все шесть разных порядков трех аргументов -lpthread, -lboost_thread и -lboost_system), но безрезультатно. Я получал ту же ошибку каждый раз. Возможно, это актуально: когда я добавляю флаг -static, я получаю другую ошибку: ld: library not found for -lcrt0.o. Я никогда не упоминал этот файл в командной строке. Я могу подтвердить, что обе версии .a и .dylib каждой библиотеки установлены в /usr/local/lib. - person larskholte; 12.12.2012