Я использую OSX 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
, Я проверил, что библиотеки и заголовки присутствуют там и недавно были изменены.
Я пытаюсь скомпилировать пример ускоренного асинхронного ввода-вывода, найденный здесь: 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
Я пытался использовать как Apple Clang ++ 4.0 и G ++ 4.6.0. Я получаю одну и ту же неопределенную ошибку символа в обеих программах.
Другие люди, похоже, тоже не могли скомпилировать этот пример кода. Мне известен этот вопрос: C ++ / Boost: неопределенные символы в примере? и этот: Ошибка компоновщика при компиляции примера boost.asio. Однако каждая из этих проблем, похоже, была исправлена путем добавления соответствующих ключей (-lboost_thread и -lboost_system) в командную строку. У меня уже есть те. Я также попытался добавить -lpthread без удачи.
Спасибо, что нашли время посмотреть на мой вопрос! Любая помощь приветствуется. 🙂
Просто столкнулся с этой же проблемой, и я обнаружил, что возвращение к Boost 1.49 решает проблему. Ссылки на скачивание для Boost 1.49 находятся здесь:
http://www.boost.org/users/history/version_1_49_0.html
Перед установкой 1.49 я удалил 1.52, удалив /usr/local/include/boost
а также /usr/local/lib/*boost*
, Не уверен, что изменилось между 1.49 и 1.52, чтобы вызвать эту проблему, или будет работать Boost 1.50 или 1.51.
Поместите библиотеки, с которыми вы связываетесь прошлой в командной строке.
Компоновщик GNU использует своего рода обратный поиск зависимостей, поэтому, если файл A зависит от библиотеки B, B должен прийти после А в командной строке.