c++ - 在 MS Visual Studio 2017 中将 boost::thread 与 CMake 一起使用会导致两个编译器错误

标签 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()

我正在使用 CMake 可以找到并能够构建适当的 Visual Studio 项目文件的 Boost 1.68.0。

我尝试使用 boost::random,它成功了。

但是,编译上述程序会产生两条错误消息:

  • E2512:功能测试宏的参数必须是一个简单的标识符(指出 boost 文件 error_code.hpp 中的错误)
  • LINK1104:无法打开文件“libboost_thread-vc141-mt-x64-1_68.lib”

这是 error_code.hpp 中抛出错误的行

enter image description here

我在我的 boost 安装中查找文件 'libboost_thread-vc141-mt-x64-1_68.lib' 但只找到 'boost_1_68_0\lib64-msvc-14.0\boost_thread-vc140-mt-gd-x64-1_68.lib'

链接器设置包含正确的文件:

enter image description here

那么,我的两个问题:

  1. 为什么在 error_code.hpp 中存在编译错误,它是 boost::system 模块的一部分,我该怎么办?
  2. 为什么 VS 要链接文件 libboost_thread-vc141-mt-x64-1_68.lib,而不是正确可用的 libboost_thread-vc140-mt -x64-1_68.lib?

最佳答案

我在 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 header 非常困惑,但我还没有找到一个干净的解决方案:(。 我希望/Zc 有一些开关来停用这个新的“功能”(功能测试宏)

关于c++ - 在 MS Visual Studio 2017 中将 boost::thread 与 CMake 一起使用会导致两个编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52636944/

相关文章:

c++ - 设置库之间的依赖关系 (CMake)

android - 使用附加库 (Assimp) 在 Qt 上构建 android 应用程序

c++ - 从另一个 cpp 更新文本框值

c++ - 是什么阻止编译器自动推断使用 make_shared?

c++ - 如何在 Visual Studio Code 中使用 g++ 编译和运行 cpp 文件?

c++ - 自己的字符串用法

c++ - Asio tcp 套接字上的未初始化读取错误

c++ - 使用 exit(1) 从函数返回

c++ - Boost线程等待条件

qt - cmake 相当于 CONFIG += qmltypes