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:
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:
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.