在MS Visual Studio 2017中将boost :: thread与CMake结合使用会导致两个编译器错误

时间:2018-10-03 23:23:08

标签: c++ boost cmake boost-thread

我想在项目中使用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 :feature-test-macro的参数必须是简单的标识符(指出增强文件error_code.hpp中的错误)
  • LINK1104 :文件'libboost_thread-vc14 1 -mt-x64-1_68.lib'无法打开

这是error_code.hpp中的引发错误的行

enter image description here

我在boost安装中寻找了文件'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 :(得分:4)

我在Visual Studio 2017版本15.9和Boost 1.69.0中收到相同的错误消息;我认为麻烦来自此VS版本,该版本引入了__has_cpp_attribute的某个版本,boost作者期望这些版本仅存在于clang中。

我不得不更改boost \ system \ detail \ config.hpp第50行 来自

#if defined(__has_cpp_attribute)

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

因为其余的预处理器定义仅与clang有关。

更改boost标头很混乱,但是我还没有找到一个干净的解决方案:(。 我希望/ Zc可以停用此新的“功能”(功能测试宏)

答案 1 :(得分:1)

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。另请参见here

要解决此问题,请下载并安装适当的预构建二进制文件。

答案 2 :(得分:0)

谢谢您的提示!

以下步骤解决了该问题:

1)我为MSVC 14.1(预构建二进制文件)安装了boost

2)我在CMakeLists.txt中添加了以下内容:

add_definitions(-DBOOST_ALL_NO_LIB)