Cmake no encuentra Boost


87

Estoy tratando de configurar un proyecto usando CMake, pero no puedo encontrar las bibliotecas de Boost a pesar de que están en la carpeta especificada. He especificado Boost_INCLUDE_DIR, Boost_LIBRARYDIRy BOOST_ROOT, pero sigo recibiendo un error que dice que CMake no puede encontrar Boost. ¿Cuál podría ser la razón de tal error?


Algunas versiones de Boost usan la bandera Boost_INCLUDE_DIRy otras usan la bandera Boost_INCLUDEDIR( sin el guión bajo ). Puede verificar el adecuado para su caso leyendo el FindBoost.cmakearchivo, debajo depath-to-cmake/Modules/FindBoost.cmake
marcelosalloum

Para su información, si está creando un impulso con el soporte de CMake, debe usarfind_package(Boost CONFIG)
Dmitry Sazonov

Respuestas:


105

¿Estás seguro de que lo estás haciendo de la forma correcta? La idea es que CMake se establezca BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRy BOOST_ROOTautomáticamente. Haz algo como esto en CMakeLists.txt:

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

Si boost no está instalado en una ubicación predeterminada y, por lo tanto, CMake no puede encontrarlo, puede decirle a CMake dónde buscar boost de esta manera:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

Por supuesto, esas dos líneas tienen que ser antes de la FIND_PACKAGE(Boost)en CMakeLists.txt.


36
Es ${Boost_INCLUDE_DIR}no ${BOOST_INCLUDE_DIR}, caso importa.
Ihor Kaharlichenko

3
Tal vez esto haya cambiado en las versiones más recientes de cmake, pero aquí están los documentos de referencia: cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers

2
no funciona para mí ... Encuentra la biblioteca boost, pero genera toneladas de errores en tiempo de compilación

1
¿No debería serlo BOOST_INCLUDEDIR?
Dmedine

2
@IhorKaharlichenko, pero BOOST_ROOT debería ser BOOST_ROOT. maravilloso! Permítanme probar con todos los casos, caso camel, todo en mayúsculas, con guiones bajos, sin guiones bajos ... <face-palm>
Duck Dodgers

53

Hay más ayuda disponible leyendo el FindBoost.cmakearchivo en sí. Se encuentra en su directorio 'Módulos'.

Un buen comienzo es set(Boost_DEBUG 1): esto arrojará una gran cantidad de información sobre dónde está buscando boost, qué está buscando y puede ayudar a explicar por qué no puede encontrarlo.

También puede ayudarlo a determinar si se está recuperando BOOST_ROOTcorrectamente.

FindBoost.cmakeTambién a veces tiene problemas si la versión exacta de boost no aparece en las variables Versiones disponibles. Puedes encontrar más sobre esto leyendo FindBoost.cmake.

Finalmente, FindBoost.cmake ha tenido algunos errores en el pasado. Una cosa que puede intentar es tomar una versión más nueva FindBoost.cmakede la última versión de CMake y pegarla en la carpeta de su proyecto al lado CMakeLists.txt; luego, incluso si tiene una versión anterior de boost, usará la nueva versión FindBoost.cmakeque está en la carpeta de su proyecto.

Buena suerte.


10

Yo mismo luché con este problema por un tiempo. Resultó que cmakeestaba buscando archivos de biblioteca de Boost utilizando la convención de nomenclatura de Boost, en la que el nombre de la biblioteca es una función de la versión del compilador utilizada para compilarla. Nuestras bibliotecas Boost se construyeron usando GCC 4.9.1, y esa versión del compilador estaba presente en nuestro sistema; sin embargo, GCC 4.4.7también pasó a estar instalado. Da la casualidad que el FindBoost.cmakescript de cmake detectaba automáticamente la GCC 4.4.7instalación en lugar de la GCC 4.9.1única, y por lo tanto buscaba archivos de biblioteca de Boost con " gcc44" en los nombres de archivo, en lugar de "gcc49 ".

La solución simple fue forzar a cmake a asumir que GCC 4.9 estaba presente, estableciendo Boost_COMPILER" -gcc49" en CMakeLists.txt. Con este cambio, FindBoost.cmakebusqué y encontré mis archivos de biblioteca de Boost.


6

También puede especificar la versión de Boost que le gustaría que CMake use pasando -DBOOST_INCLUDEDIRo-DBOOST_ROOT apuntando a la ubicación de los encabezados de boost de la versión correcta

Ejemplo:

cmake -DBOOST_ROOT=/opt/latestboost

Esto también será útil cuando haya varias versiones de refuerzo en el mismo sistema.


Gracias, eso funcionó para mí con Avro build para Windows.
ggurov

5

También tuve un problema similar y descubrí que las variables de env BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR y BOOST_ROOT deben contener rutas absolutas . HTH!


Si. Tuve el mismo problema debido a la ruta relativa en el env BOOST_ROOT. ¡Muchas gracias a ti!
korst1k

2

Tuve el mismo problema al intentar ejecutar makeun proyecto después de instalar Boost versión 1.66.0 en Ubuntu Trusty64. El mensaje de error era similar (no exactamente igual) a este:

CMake Error at     
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old.  Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)

Boost definitivamente se instaló, pero CMake no pudo detectarlo. Después de pasar mucho tiempo jugando con rutas y variables ambientales, finalmente terminé comprobando las cmakeopciones y encontré lo siguiente:

--check-system-vars        = Find problems with variable usage in system files

Entonces ejecuté lo siguiente en el directorio en cuestión:

sudo cmake --check-system-vars

que regresó:

Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   chrono
--   regex
--   serialization
--   program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject

y resolvió el problema.


2

Para que la versión de cmake se 3.1.0-rc2recoja, boost 1.57especifique-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2por defecto boost<=1.56.0es como se ve usando-DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++


2

Si está creando su propio impulso, no olvide usar el; de lo --layout=versionedcontrario, la búsqueda de una versión particular de la biblioteca fallará


1

Un consejo más para cualquiera que intente construir CGAL en particular, con Boost vinculado estáticamente. No basta con definir Boost_USE_STATIC_LIBS; se anula cuando el tiempo Boost_DEBUGmuestra su valor. Lo que debe hacer aquí es marcar la casilla de verificación "Avanzado" y habilitar CGAL_Boost_USE_STATIC_LIBS.


0

Tuve el mismo problema y ninguna de las soluciones anteriores funcionó. En realidad, el archivoinclude/boost/version.hpp no se pudo leer (mediante el script cmake lanzado por jenkins).

Tuve que cambiar manualmente el permiso de la biblioteca (boost) (aunque jenkins pertenece al grupo, pero ese es otro problema vinculado a jenkins que no pude resolver):

chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
#chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess

0

Esto también puede suceder si CMAKE_FIND_ROOT_PATHse establece como diferente de BOOST_ROOT. Enfrenté el mismo problema que, a pesar de la configuración BOOST_ROOT, recibía el error. Pero para la compilación cruzada para ARM estaba usando Toolchain-android.cmake en el que tenía (por alguna razón):

set(BOOST_ROOT "/home/.../boost")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")

CMAKE_FIND_ROOT_PATHparece estar anulando lo BOOST_ROOTque estaba causando el problema.


-1

Tal vez

brew install boost

Te ayudará.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.