简体   繁体   中英

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

I want to use boost::thread in my project and I use CMake as a build tool. However, even a very simple setup results in two compiler errors:

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

I'm using Boost 1.68.0 which CMake can find and is able to build proper Visual Studio project files.

I tried using boost::random, and it worked.

However, compiling the above program results in two error messages:

  • E2512 : Argument for a feature-test-macro has to be a simple identifier (pointing out to an error in boost file error_code.hpp)
  • LINK1104 : File 'libboost_thread-vc14 1 -mt-x64-1_68.lib' cannot be opened

This is the line in error_code.hpp which throws the error

在此输入图像描述

I looked for the file 'libboost_thread-vc14 1 -mt-x64-1_68.lib' in my boost installation but only found 'boost_1_68_0\\lib64-msvc-14.0\\boost_thread-vc14 0 -mt-gd-x64-1_68.lib'

The linker settings contain the correct files:

在此输入图像描述

So, my two questions:

  1. Why is there a compilation error in error_code.hpp, which is part of the boost::system module and what can I do about it?
  2. Why does VS want to link the file libboost_thread-vc14 1 -mt-x64-1_68.lib, instead of the correct and available libboost_thread-vc14 0 -mt-x64-1_68.lib?

I get the same error message in Visual Studio 2017 version 15.9 and Boost 1.69.0; I think that the trouble arises from this VS version introducing some version of __has_cpp_attribute which the boost authors expected only to be present in clang.

I had to change boost\\system\\detail\\config.hpp line 50 from

#if defined(__has_cpp_attribute)

to

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

as the remaining preprocessor define is only relevant to clang anyways.

Changing boost headers is quite messy, but I didn't find a clean solution yet :(. I was hoping /Zc had some switch to deactive this new "feature" (feature testing macro)

1) If you use

set(Boost_USE_STATIC_LIBS OFF)

and dont give a version number for boost

find_package(Boost COMPONENTS random thread) 

since you are using 1.68 and not 1.58, right? It should work. I can reproduce your error messages with your settings and it works using the mentioned settings.

2) The boost CMake package file searches for a boost version depending on your selected compiler, I guess the default for vs 2017 is 14.1. See also here .

To solve this problem, download and install the proper prebuilt binaries.

Thank you for your hints!

The following steps resolved the problem:

1) I installed boost for MSVC 14.1 (prebuild binaries)

2) I added the following to the CMakeLists.txt:

add_definitions(-DBOOST_ALL_NO_LIB)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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