代码之家  ›  专栏  ›  技术社区  ›  WolfgangP

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

  •  2
  • WolfgangP  · 技术社区  · 6 年前

    我想在我的项目中使用boost::thread,并使用CMake作为构建工具。但是,即使是非常简单的设置也会导致两个编译器错误:

    #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()
    

    我使用的是boost1.68.0,CMake可以找到它,并能够构建适当的visualstudio项目文件。

    我试着使用boost::random,结果成功了。

    • E2512型 :功能测试宏的参数必须是简单标识符(指向boost文件错误中的错误)_代码.hpp)
    • 链接1104 :文件'libboost\u thread-vc14 1 -无法打开mt-x64-1_68.lib

    enter image description here

    1 -mt-x64-1_68.lib,但只找到了boost_1_68_0\lib64-msvc-14.0\boost_thread-vc14 -mt-gd-x64-1_68.lib'

    enter image description here

    1. 为什么会有编译错误呢_代码.hpp,它是boost::system模块的一部分,我可以对此做些什么?
    2. 为什么VS要链接libboost\u thread-vc14文件 1 -mt-x64-1_68.lib,而不是正确且可用的libboost_thread-vc14 0 -mt-x64-1_68.lib?
    3 回复  |  直到 6 年前
        1
  •  7
  •   Oliver Zendel    6 年前

    我在VisualStudio2017版本15.9和Boost 1.69.0中收到了相同的错误消息;我认为问题是由于这个VS版本引入了某些版本的uu has u cpp_属性,Boost作者只希望该属性以铿锵的形式出现。

    我不得不更改boost\system\detail\配置.hpp第50行

    #if defined(__has_cpp_attribute)
    

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

    因为剩下的预处理器define只与clang相关。

    更改boost头文件非常麻烦,但我还没有找到一个干净的解决方案:(。 我希望/Zc有一些开关来关闭这个新的“特性”(特性测试宏)

        2
  •  1
  •   Gombat    6 年前

    1) 如果你使用

    set(Boost_USE_STATIC_LIBS OFF)
    

    不要给出boost的版本号

    find_package(Boost COMPONENTS random thread) 
    

    2) boostcmake包文件根据您选择的编译器搜索boost版本,我猜vs2017的默认版本是14.1。另请参见 here

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

        3
  •  0
  •   WolfgangP    6 年前

    以下步骤解决了问题:

    2) 我将以下内容添加到CMakeLists.txt文件:

    add_definitions(-DBOOST_ALL_NO_LIB)