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

Я хочу использовать 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 : Аргументом для функции-test-macro должен быть простой идентификатор (указывает на ошибку в буст-файле error_code.hpp)
  • LINK1104 : Файл 'libboost_thread-vc14 1 -mt-x64-1_68.lib' открыть нельзя

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

enter image description here

Я искал файл 'libboost_thread-vc14 1 -mt-x64-1_68.lib 'в моей установке буста, но нашел только' boost_1_68_0 \ lib64-msvc-14.0 \ boost_thread-vc14 0 -mt-gd-x64-1_68.lib '

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

enter image description here

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

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

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Спасибо за ваши подсказки!

Следующие шаги решили проблему:

1) Я установил boost для MSVC 14.1 (prebuild binaries)

2) Я добавилследующее в CMakeLists.txt:

add_definitions(-DBOOST_ALL_NO_LIB)
0 голосов
/ 03 января 2019

Я получаю одно и то же сообщение об ошибке в Visual Studio 2017 версии 15.9 и Boost 1.69.0;Я думаю, что проблема возникает из-за этой версии VS, представляющей некоторую версию __has_cpp_attribute, которую авторы наддува ожидали присутствовать только в clang.

Мне пришлось изменить строку 50 boost \ system \ detail \ config.hpp с

#if defined(__has_cpp_attribute)

до

#if defined(__clang__) && defined(__has_cpp_attribute)

, поскольку определение оставшегося препроцессора в любом случае относится только к clang.

Изменение заголовков буста довольно грязное, но я не нашелпока что чистое решение :(. Я надеялся, что у / Zc был какой-то переключатель, чтобы деактивировать эту новую «функцию» (макрос тестирования функций)

0 голосов
/ 04 октября 2018

1) Если вы используете

set(Boost_USE_STATIC_LIBS OFF)

и не даете номер версии для boost

find_package(Boost COMPONENTS random thread) 

, поскольку вы используете 1,68, а не 1,58, верно?Он должен работать.Я могу воспроизвести ваши сообщения об ошибках с вашими настройками, и это работает с использованием упомянутых настроек.

2) Файл пакета повышения CMake выполняет поиск версии повышения в зависимости от выбранного вами компилятора. Я полагаю, по умолчанию для версии 2017 это 14,1.Смотри также здесь .

Чтобы решить эту проблему, загрузите и установите соответствующие готовые двоичные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...