CMake не находит библиотеки Boost
Я пытаюсь использовать сценарий 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 из источник.
Я посмотрел на вывод Debug из файла FindBoost.cmake
(я использую скрипт по умолчанию из CMake 2.8), и он, похоже, не смотрит на bin.v2
. Вместо этого он ищет boost_ROOT/lib
, но когда я скопировал содержимое из bin.v2\libs
в lib, он все равно ничего не нашел.
Так что же это за элегантный способ найти Boost, который также будет работать на других платформах с распространенными дистрибутивами Boost?
Ответы
Ответ 1
Что ж, я решил проблему, но не полностью удовлетворен своим решением.
На мой взгляд, проблема заключалась в том, что 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
Я бы попробовал установить 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)
Ответ 3
У меня была проблема с этим раньше. По какой-то причине b2 (он же BJam) создал библиотеки Boost с лидирующей "lib".
Сценарий CMake не будет искать файл с именем libboost_thread.lib
. Он найдет только boost_thread.lib
. Удалите ведущую lib
, и CMake должен найти их.
Ответ 4
Я пришел сюда с похожей проблемой и просто хотел сказать, что мое исправление было похожим, но не совсем тем же.
Мой префикс установки был 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 нашел все.
Ответ 5
Вы можете добавить следующую опцию в командную строку CMake, чтобы указать CGAL использовать статические библиотеки Boost:
-DCGAL_Boost_USE_STATIC_LIBS=true