I\'m trying to use a CMake script to compile a Boost-based application on Windows. The header-only libraries work fine, but CMake fails to find the libraries (the following
I would try setting BOOST_ROOT
inside your CMakeLists.txt
file. I know that CMake 2.8.6 will find Boost 1.47.0 when you set the Boost_ADDITIONAL_VERSIONS
variable since it works for me on Windows when I have BOOST_ROOT
set.
Here is what I have in one project:
set( BOOST_COMPONENTS_NEEDED serialization ) # The following verifyies that BOOST_ROOT is set properly. if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") FILE( TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT ) if( NOT EXISTS ${BOOST_ROOT} ) MESSAGE( STATUS ${BOOST_ROOT} " does not exist. Checking if BOOST_ROOT was a quoted string.." ) STRING( REPLACE "\"" "" BOOST_ROOT ${BOOST_ROOT} ) if( EXISTS ${BOOST_ROOT} ) MESSAGE( STATUS "After removing the quotes " ${BOOST_ROOT} " was now found by CMake" ) endif( EXISTS ${BOOST_ROOT}) endif( NOT EXISTS ${BOOST_ROOT} ) # Save the BOOST_ROOT in the cache if( NOT EXISTS ${BOOST_ROOT} ) MESSAGE( WARNING ${BOOST_ROOT} " does not exist." ) else(NOT EXISTS ${BOOST_ROOT}) SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "Set the value of BOOST_ROOT to point to the root folder of your boost install." FORCE) #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/Include) #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) endif( NOT EXISTS ${BOOST_ROOT} ) endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") if( WIN32 AND NOT BOOST_ROOT ) MESSAGE( WARNING "Please set the BOOST_ROOT environment variable." ) endif( WIN32 AND NOT BOOST_ROOT ) set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") set(Boost_DEBUG ON) set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) FIND_PACKAGE(Boost 1.47.0 COMPONENTS ${BOOST_COMPONENTS_NEEDED}) if(Boost_FOUND) MESSAGE( STATUS "Setting up boost." ) include_directories(${Boost_INCLUDE_DIRS}) if(Boost_DEBUG) MESSAGE( STATUS "BOOST Libraries " ${Boost_LIBRARIES} ) FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) STRING( TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE ) MESSAGE( STATUS "Boost " ${BOOST_COMPONENT} ": " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY} ) MESSAGE( STATUS "Boost " ${BOOST_COMPONENT} " Debug: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG} ) MESSAGE( STATUS "Boost " ${BOOST_COMPONENT} " Release: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE} ) ENDFOREACH(BOOST_COMPONENT) endif(Boost_DEBUG) endif(Boost_FOUND)
Well, I solved the problem, but I'm not fully satisfied with my solution.
In my opinion the problem was that BJam creates a too complex folder structure. Now I just copied the library files from "boost_1_47_0\bin.v2\libs\serialization\build\msvc-9.0\debug\link-static\threading-multi" to "boost_1_47_0\lib".
I have to do this by hand, but I'm not using that many Boost libraries, so this step is OK in my opinion. I will document my solution aside the CMake script, so other users should get along with that.
I've had a problem with this before. For some reason b2 (aka BJam) created the Boost libraries with a leading "lib".
The CMake script will not look for a file named libboost_thread.lib
. It will only find boost_thread.lib
. Remove the leading lib
and CMake should find them.
You can add the following option to the command line of CMake to tell CGAL to use the static Boost libraries:
-DCGAL_Boost_USE_STATIC_LIBS=true
I came here with a similar issue and just wanted to say my fix was similar, but not exactly the same.
My install prefix was C:\lib\boost\boost_1_57_0
. I set a BOOST_ROOT
environment variable pointing to that directory, but CMake (3.1.0) still couldn't find the headers. I realized the headers defaulted to install to C:\lib\boost\boost_1_57_0\include\boost-1_57\boost
. I'm not going to run multiple versions so I just moved the final Boost directory down one and removed the boost-1_57
directory and ended up with headers here:
C:\lib\boost\boost_1_57_0\include\boost
And CMake found everything.