Я скачал 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()
Благодарю.
В своем буст-репо убедитесь, что вы запустили ./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 бит)
Что касается сообщения 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
) промежуточный каталог не создан для других макетов.