CMake не находит библиотеки Boost - PullRequest
18 голосов
/ 10 ноября 2011

Я пытаюсь использовать сценарий CMake для компиляции приложения на основе Boost в Windows.Библиотеки только для заголовков работают нормально, но 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файлы и другие вещи, но это не должно быть проблемой, так как кажется, что это нормальный способ собрать Boost на Windows из исходного кода.

Я посмотрел на вывод отладки из файла FindBoost.cmake (яЯ использую скрипт по умолчанию из CMake 2.8), и он, похоже, не рассматривает bin.v2.Вместо этого он ищет boost_ROOT/lib, но когда я скопировал содержимое из bin.v2\libs в lib, он все равно ничего не нашел.

Так что же это элегантный способ найти Boost, который также будет работать на других платформах сраспространенные дистрибутивы Boost?

Ответы [ 5 ]

14 голосов
/ 10 ноября 2011

Я бы попробовал установить BOOST_ROOT внутри вашего CMakeLists.txt файла. Я знаю, что CMake 2.8.6 найдет Boost 1.47.0, когда вы установите переменную Boost_ADDITIONAL_VERSIONS, поскольку она работает для меня в Windows, когда у меня установлено 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)

6 голосов
/ 15 ноября 2011

Ну, я решил проблему, но не полностью удовлетворен своим решением.

По моему мнению, проблема заключалась в том, что 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, так что другие пользователи должны согласиться с этим.

1 голос
/ 11 ноября 2011

У меня была проблема с этим раньше. По какой-то причине b2 (он же BJam) создал библиотеки Boost с лидирующей "lib".

Скрипт CMake не будет искать файл с именем libboost_thread.lib. Он найдет только boost_thread.lib. Удалите ведущие lib, и CMake должен их найти.

0 голосов
/ 15 января 2015

Я пришел сюда с похожей проблемой и просто хотел сказать, что мое исправление было похоже, но не совсем то же самое.

Мой префикс установки был 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 нашел все.

0 голосов
/ 25 сентября 2013

Вы можете добавить следующую опцию в командную строку CMake, чтобы указать CGAL использовать статические библиотеки Boost:

-DCGAL_Boost_USE_STATIC_LIBS=true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...