CMake没有找到Boost库

时间:2011-11-10 09:51:57

标签: 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)

我的项目中有一个名为“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发行版的平台?

5 个答案:

答案 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