簡體   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