繁体   English   中英

在MS Visual Studio 2017中使用带有CMake的boost :: thread会导致两个编译器错误

[英]Using boost::thread with CMake in MS Visual Studio 2017 results in two compiler errors

我想在我的项目中使用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()

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

我尝试使用boost :: random,它有效。

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

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

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

在此输入图像描述

我在我的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'

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

在此输入图像描述

那么,我的两个问题:

  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?

我在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)

因为剩余的预处理器定义仅与clang相关。

改变提升标题是相当混乱的,但我还没有找到一个干净的解决方案:(。我希望/ Zc有一些切换到deactive这个新的“功能”(功能测试宏)

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)我为MSVC 14.1安装了boost(预构建二进制文件)

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

add_definitions(-DBOOST_ALL_NO_LIB)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM