4
votes

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-vc141-mt-x64-1_68.lib' cannot be opened

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

enter image description here

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

The linker settings contain the correct files:

enter image description here

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-vc141-mt-x64-1_68.lib, instead of the correct and available libboost_thread-vc140-mt-x64-1_68.lib?
3
It looks like you're compiling your code with a different version of your compiler than you used to build boost. That's throwing off boost's #pragma comment(lib, ...) directives. You should really build boost with the same version of your compiler you use for your code.Miles Budnek
Since 14.0 Boost should be compatible with 14.1 toolchain, you could also disable the #pragma comment(lib) directives with something like target_compile_definitions(test PUBLIC BOOST_ALL_NO_LIB)Daniel Schepler

3 Answers

7
votes

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
votes

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.

0
votes

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)