Я хочу использовать boost :: thread в своем проекте и использую CMake в качестве инструмента сборки. Однако даже очень простая настройка приводит к двум ошибкам компилятора:
main.cpp
#include <boost/thread.hpp>
int main()
{
boost::thread t;
return 0;
}
CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (ThreadTest)
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.58.0 COMPONENTS random thread)
set(SOURCE_DIR src)
set(SOURCE_FILES
${SOURCE_DIR}/main.cpp
)
if (Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(test ${SOURCE_FILES})
target_link_libraries(test ${Boost_LIBRARIES})
endif ()
Я использую Boost 1.68.0, который CMake может найти и может создавать правильные файлы проекта Visual Studio.
Я пробовал использовать boost :: random, и это сработало.
Однако компиляция указанной выше программы приводит к появлению двух сообщений об ошибках:
Это строка в error_code.hpp, которая вызывает ошибку
Я искал файл libboost_thread-vc141-mt-x64-1_68.lib в своей установке boost, но нашел только boost_1_68_0 \ lib64-msvc-14.0 \ boost_thread-vc140-mt-gd-x64-1_68.lib '
В настройках компоновщика содержатся правильные файлы:
Итак, два моих вопроса:
Поскольку 14.0 Boost должен быть совместим с набором инструментов 14.1, вы также можете отключить директивы #pragma comment(lib) с помощью чего-то вроде target_compile_definitions(test PUBLIC BOOST_ALL_NO_LIB)





1) Если вы используете
set(Boost_USE_STATIC_LIBS OFF)
и не указывайте номер версии для повышения
find_package(Boost COMPONENTS random thread)
поскольку вы используете 1,68, а не 1,58, верно? Он должен работать. Я могу воспроизвести ваши сообщения об ошибках с вашими настройками, и он работает с указанными настройками.
2) Файл пакета boost CMake ищет версию boost в зависимости от выбранного вами компилятора, я думаю, что по умолчанию для vs 2017 - 14.1. См. Также здесь.
Чтобы решить эту проблему, загрузите и установите соответствующие готовые двоичные файлы.
Спасибо за подсказки!
Следующие шаги разрешили проблему:
1) Я установил boost для MSVC 14.1 (предварительно созданные двоичные файлы)
2) Я добавил в CMakeLists.txt следующее:
add_definitions(-DBOOST_ALL_NO_LIB)
для меня ошибка компиляции не исчезла с этим "add_definitions" ... :( Что еще это могло быть?
Вы должны особенно позаботиться о том, чтобы ваша библиотека Boost точно соответствовала вашей версии Visual Studio. Вы должны использовать предварительно созданные библиотеки.
@WolfgangP: ошибка в заголовочном файле Boost. «Предварительно созданные библиотеки ускорения» влияют только на файлы .cpp в Boost, которые для предварительно созданных библиотек будут скомпилированы в .obj, а затем связаны в формате .lib.
Я получаю такое же сообщение об ошибке в Visual Studio 2017 версии 15.9 и Boost 1.69.0; Я думаю, что проблема возникает из-за того, что эта версия VS представляет некоторую версию __has_cpp_attribute, которую авторы повышения ожидали только в clang.
Мне пришлось изменить boost \ system \ detail \ config.hpp строку 50 из
#if defined(__has_cpp_attribute)
к
#if defined(__clang__) && defined(__has_cpp_attribute)
поскольку оставшееся определение препроцессора в любом случае имеет отношение только к лязгам.
Менять заголовки буста довольно беспорядочно, но я пока не нашел чистого решения :(. Я надеялся, что у / Zc есть какой-то переключатель, чтобы отключить эту новую «функцию» (макрос тестирования функций)
Была такая же проблема с 15.9.4 и Boost 1.69.0. Ваш ответ решает эту проблему, но я все равно хотел бы увидеть решение, которое не связано с изменением заголовков Boost.
Я тоже, я подозреваю, что это должно быть исправлено MS или это исправление должно быть перенесено в магистраль ускорения
Addenum: теперь это исправлено в текущей ветке разработки; В выпуске v1.70 все еще есть код взлома (см. github.com/boostorg/system/commit/…)
Похоже, вы компилируете свой код с другой версией вашего компилятора, чем вы использовали для сборки boost. Это сбрасывает директивы Boost
#pragma comment(lib, ...). Вам действительно следует создавать Boost с той же версией вашего компилятора, которую вы используете для своего кода.