我正在尝试使用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)
我的项目中有一个名为“Libs”的文件夹,其中存储了第三方库,如DevIL和Boost,所以我先设置它。它适用于Devil和Boost头文件,所以我假设我不需要BOOST_ROOT变量。
Boost安装是boost.org的标准源代码发行版,我使用BJam编译。这些库存储在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\libs
复制到lib时,它仍然没有找到任何内容。
那么找到Boost的优雅方法是什么呢?它也适用于其他具有常见Boost发行版的平台?
答案 0 :(得分:14)
我会尝试在BOOST_ROOT
文件中设置CMakeLists.txt
。我知道当你设置Boost_ADDITIONAL_VERSIONS变量时,CMake 2.8.6会找到Boost 1.47.0,因为当我设置BOOST_ROOT
时,它适用于我。
以下是我在一个项目中的内容:
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)
答案 1 :(得分:6)
嗯,我解决了这个问题,但我对我的解决方案并不完全满意。
在我看来,问题是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脚本之外,因此其他用户应该相处。
答案 2 :(得分:1)
之前我遇到过这个问题。出于某种原因,b2(又名BJam)使用领先的“lib”创建了Boost库。
CMake脚本不会查找名为libboost_thread.lib
的文件。它只会找到boost_thread.lib
。删除前导lib
,CMake应该找到它们。
答案 3 :(得分:0)
我带着类似的问题来到这里,只想说我的解决方案类似,但不完全一样。
我的安装前缀为C:\lib\boost\boost_1_57_0
。我设置了一个指向该目录的BOOST_ROOT
环境变量,但是CMake(3.1.0)仍然无法找到标题。我意识到标头默认安装到C:\lib\boost\boost_1_57_0\include\boost-1_57\boost
。我不打算运行多个版本所以我只是将最后一个Boost目录向下移动了一个并移除了boost-1_57
目录并最终得到了标题:
C:\lib\boost\boost_1_57_0\include\boost
CMake发现了一切。
答案 4 :(得分:-1)
您可以将以下选项添加到CMake的命令行,告诉CGAL使用静态Boost库:
-DCGAL_Boost_USE_STATIC_LIBS=true