Jon*_*anK 19 windows boost cmake
我正在尝试使用CMake脚本在Windows上编译基于Boost的应用程序.仅头文件库工作正常,但CMake无法找到库(无法找到以下Boost库:) boost_serialization.CMake脚本的相关部分是:
# Path where CMake can find additional libraries
SET(CMAKE_PREFIX_PATH Libs)
# Boost
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
SET(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS serialization)
Run Code Online (Sandbox Code Playgroud)
我的项目中有一个名为"Libs"的文件夹,其中存储了第三方库,如DevIL和Boost,所以我先设置它.它适用于Devil和Boost头文件,所以我假设我不需要BOOST_ROOT变量.Boost安装是我用BJam编译的boost.org的标准源代码.这些库存储在boost_1_47_0\bin.v2\libs,并且我没有在构建过程中更改任何内容.
我认为这有点奇怪,该boost_1_47_0\libs文件夹不包含任何库文件,但BJam文件和其他东西,但这不应该是一个问题,因为这似乎是从源代码在Windows上构建Boost的常规方法.
我查看了FindBoost.cmake文件中的Debug输出(我使用的是CMake 2.8中的默认脚本)并且它似乎没有查看bin.v2.相反,它搜索boost_ROOT/lib,但当我将内容从bin.v2\libslib 复制到lib时,它仍然没有找到任何东西.
那么找到Boost的优雅方法是什么呢?它也适用于其他具有常见Boost发行版的平台?
dre*_*rjm 14
我会尝试BOOST_ROOT在你的CMakeLists.txt文件中设置.我知道的CMake 2.8.6会发现加速1.47.0当你设置Boost_ADDITIONAL_VERSIONS变量,因为它为我工作在Windows上,当我已经Boost_ADDITIONAL_VERSIONS设定.
以下是我在一个项目中的内容:
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)
好吧,我解决了这个问题,但我对我的解决方案并不完全满意.
在我看来,问题是BJam创建了一个太复杂的文件夹结构.现在我只是将库文件从"boost_1_47_0\bin.v2\libs\serialization\build\msvc-9.0\debug\link-static\threading-multi"复制到"boost_1_47_0\lib".
我必须手动执行此操作,但我没有使用那么多Boost库,所以我认为这一步是可以的.我会将我的解决方案记录在CMake脚本之外,因此其他用户应该相处.