Использование boost :: thread с CMake в MS Visual Studio 2017 приводит к двум ошибкам компилятора

Я хочу использовать 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, и это сработало.

Однако компиляция указанной выше программы приводит к появлению двух сообщений об ошибках:

  • E2512: аргумент для макроса проверки возможности должен быть простым идентификатором (указывающим на ошибку в файле boost error_code.hpp)
  • LINK1104: файл libboost_thread-vc141-mt-x64-1_68.lib не может быть открыт

Это строка в error_code.hpp, которая вызывает ошибку

Использование boost :: thread с CMake в MS Visual Studio 2017 приводит к двум ошибкам компилятора

Я искал файл 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 '

В настройках компоновщика содержатся правильные файлы:

Использование boost :: thread с CMake в MS Visual Studio 2017 приводит к двум ошибкам компилятора

Итак, два моих вопроса:

  1. Почему возникает ошибка компиляции в error_code.hpp, который является частью модуля boost :: system, и что я могу с этим сделать?
  2. Почему VS хочет связать файл libboost_thread-vc141-mt-x64-1_68.lib вместо правильного и доступного libboost_thread-vc140-mt-x64-1_68.lib?

Похоже, вы компилируете свой код с другой версией вашего компилятора, чем вы использовали для сборки boost. Это сбрасывает директивы Boost #pragma comment(lib, ...). Вам действительно следует создавать Boost с той же версией вашего компилятора, которую вы используете для своего кода.

Miles Budnek 04.10.2018 01:41

Поскольку 14.0 Boost должен быть совместим с набором инструментов 14.1, вы также можете отключить директивы #pragma comment(lib) с помощью чего-то вроде target_compile_definitions(test PUBLIC BOOST_ALL_NO_LIB)

Daniel Schepler 04.10.2018 02:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
1 924
3

Ответы 3

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" ... :( Что еще это могло быть?

Zordid 07.03.2019 13:56

Вы должны особенно позаботиться о том, чтобы ваша библиотека Boost точно соответствовала вашей версии Visual Studio. Вы должны использовать предварительно созданные библиотеки.

WolfgangP 08.03.2019 16:32

@WolfgangP: ошибка в заголовочном файле Boost. «Предварительно созданные библиотеки ускорения» влияют только на файлы .cpp в Boost, которые для предварительно созданных библиотек будут скомпилированы в .obj, а затем связаны в формате .lib.

MSalters 04.06.2019 11:30

Я получаю такое же сообщение об ошибке в 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.

Mikkel K. 04.01.2019 13:55

Я тоже, я подозреваю, что это должно быть исправлено MS или это исправление должно быть перенесено в магистраль ускорения

Oliver Zendel 11.01.2019 16:05

Addenum: теперь это исправлено в текущей ветке разработки; В выпуске v1.70 все еще есть код взлома (см. github.com/boostorg/system/commit/…)

Oliver Zendel 13.05.2019 10:05

Другие вопросы по теме