буст именования отсутствуют

Я скачал Boost и собрал его, и не в первый раз, но потом все стало казаться странным.

Сначала я получил эти ошибки при компиляции моего проекта (который использует boost):

/usr/local/include/boost/system/error_code.hpp:221: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:222: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:223: undefined reference to `boost::system::system_category()'
/usr/local/include/boost/system/error_code.hpp:221: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:222: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:223: undefined reference to `boost::system::system_category()'
/usr/local/include/boost/thread/exceptions.hpp:51: undefined reference to `boost::system::system_category()'
/usr/local/include/boost/thread/exceptions.hpp:84: undefined reference to `boost::system::system_category()'
/usr/local/include/boost/thread/pthread/thread_data.hpp:152: undefined reference to `vtable for boost::detail::thread_data_base'
/usr/local/include/boost/thread/pthread/thread_data.hpp:195: undefined reference to `boost::detail::get_current_thread_data()'
/usr/local/include/boost/thread/detail/thread.hpp:179: undefined reference to `boost::thread::start_thread_noexcept()'
/usr/local/include/boost/thread/detail/thread.hpp:741: undefined reference to `boost::thread::native_handle()'
/usr/local/include/boost/thread/detail/thread.hpp:767: undefined reference to `boost::thread::join_noexcept()'
/usr/local/include/boost/thread/detail/thread.hpp:779: undefined reference to `boost::thread::do_try_join_until_noexcept(timespec const&, bool&)'
/usr/local/include/boost/thread/pthread/condition_variable.hpp:84: undefined reference to `boost::this_thread::interruption_point()'
/usr/local/include/boost/thread/detail/thread.hpp:90: undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
/usr/local/include/boost/system/error_code.hpp:221: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:222: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:223: undefined reference to `boost::system::system_category()'

Итак, я пошел проверить, все ли на месте, и обнаружил, что у меня есть файлы lib для boost, которые не имеют обычного именования библиотек, то есть они просто выглядят так: libboost_thread.a, libboost_system.a, libboost_date_time.aвместо -mt, -d и так далее.

Я не помню, как именно я его построил, но если я попытаюсь запустить:
boost_src_dir > ./b2 threading=multi link=static variant=debug,release
Я получил:

error: Name clash for '<pstage/lib>libboost_atomic.a'
error:
error: Tried to build the target twice, with property sets having
error: these incompatible properties:
error:
error:     -  <debug-symbols>on <inlining>off <optimization>off <runtime-debugging>on <variant>debug
error:     -  <debug-symbols>off <define>NDEBUG <inlining>full <optimization>speed <runtime-debugging>off <variant>release
error:
error: Please make sure to have consistent requirements for these
error: properties everywhere in your project, especially for install
error: targets.

Не совсем уверен, что происходит, предыдущие разы я делал это, все прошло довольно гладко ..
Есть идеи?

Я использую Linux Mint (17,2 х64), повысить 1,59 и использовать его с Cmake, например, так:

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost 1.36.0 COMPONENTS system thread shared_ptr)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
else()
message("can not find boost")
endif()

Благодарю.

2

Решение

В своем буст-репо убедитесь, что вы запустили ./bootstrap.sh с --prefix=<install directory> если вы хотите это не в месте по умолчанию. Вам не нужен этот аргумент, хотя.

После этого вы можете запустить команду ./b2 из того же каталога, чтобы снова установить boost с помощью команды --prefix=<install directory> вариант, если требуется. Возможно, вам придется удалить все предыдущие файлы сборки из вашего каталога build / install, прежде чем пытаться это сделать.

Кроме того, убедитесь, что у вас есть правильная версия для вашей машины. я использовал http://downloads.sourceforge.net/boost/boost_1_58_0.tar.bz2 для моего (OpenSUSE 13.1 64 бит)

1

Другие решения

Что касается сообщения error: Name clash for '<pstage/lib>libboost_atomic.a':

Я просто суммирую здесь объяснение и решение (которое дал @Nitzan Tomer кратко выше, и для которого, ответ @Samidamaru не обеспечил решение).

Проблема была о --layout Спецификация. Увидеть b2 --help для --layout вариант.

В Linux макет по умолчанию systemЭто означает, что для всех видов сборок библиотеки создаются со схемой: libboost_<library-name>.a (или же .lib на винде).
Это означает, что один и тот же файл будет создан для debug а также release вариант. Так как Ницан запросил оба варианта, передав variant=debug,release созданные файлы будут перезаписывать друг друга. b2 сообщил об этом как об ошибке.

+-----------------------+-------------------------------------------------------------------------------+----------------------------------------+-------------------------+
| | --layout |
+ ----------------------- + ------------------------- -------------------------------------------------- ---- + ---- + ---------------------------------------- --------------------- +
| | версиями | помеченный | система |
+ ----------------------- + ------------------------- -------------------------------------------------- ---- + ---- + ---------------------------------------- --------------------- +
| Имя файла библиотеки: | libboost_ {имя_библиотеки} - {набор инструментов} [- mt] - {тег ABI} ​​- {тег ARCH} - {повысить тег тега} .lib | libboost_ {имя_библиотеки} [- mt] - {тег ABI} ​​.lib | libboost_ {lib name} .lib |
+ ----------------------- + ------------------------- -------------------------------------------------- ---- + ---- + ---------------------------------------- --------------------- +
| Каталог заголовочных файлов: | include / boost_ {boost ver tag} | включить | включить |
+ ----------------------- + ------------------------- -------------------------------------------------- ---- + ---- + ---------------------------------------- --------------------- +
| Примечания: | По умолчанию в Windows. | Различные наборы инструментов (например, разные | По умолчанию в Linux. |
| | Все варианты могут быть созданы в одной папке. | версии компилятора), архитектура и | Все вариации должны быть |
| | См. «Наименование библиотеки» в | модель адреса НЕ МОЖЕТ быть сгенерирована в | создан в отдельном |
| | https://www.boost.org/doc/libs/1_68_0/more/getting_started/unix-variants.html | та же папка. Но отладка / отладка и | папки. |
| | Соответствующие опции b2 также указаны на этой странице. | однониточный / многопоточный может быть. | |
+ ----------------------- + ------------------------- -------------------------------------------------- ---- + ---- + ---------------------------------------- --------------------- +

Конечно, в Linux .a а также .so Пост-исправления используются против .lib а также .dll на винде. lib префикс пропускается из имен DLL в Windows.
В Windows однопоточные версии могут быть созданы только если runtime-link=static вариант был установлен.

Для заголовков «обычный» boost каталог по-прежнему создается в указанной папке.
Это означает, что если вы прошли, например, --prefix=/tools/boost в b2то следующая структура каталогов создается для versioned расположение:

/ Инструменты / импульс
|
+ --- lib
|
+ --- включить
+ --- boost_ {повысить версию тега}
|
+ --- буст
+ --- аккумуляторы
+ --- алгоритм
и т.п.

boost_{boost version tag} (например. boost_1_68) промежуточный каталог не создан для других макетов.

1