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_LIBRARYDIR
y 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?
87
Boost_INCLUDE_DIR
y otras usan la banderaBoost_INCLUDEDIR
( sin el guión bajo ). Puede verificar el adecuado para su caso leyendo elFindBoost.cmake
archivo, debajo depath-to-cmake/Modules/FindBoost.cmake
find_package(Boost CONFIG)
Respuestas:
¿Estás seguro de que lo estás haciendo de la forma correcta? La idea es que CMake se establezca
BOOST_INCLUDE_DIR
,BOOST_LIBRARYDIR
yBOOST_ROOT
automáticamente. Haz algo como esto enCMakeLists.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)
enCMakeLists.txt
.fuente
${Boost_INCLUDE_DIR}
no${BOOST_INCLUDE_DIR}
, caso importa.BOOST_INCLUDEDIR
?Hay más ayuda disponible leyendo el
FindBoost.cmake
archivo 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_ROOT
correctamente.FindBoost.cmake
Tambié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 leyendoFindBoost.cmake
.Finalmente,
FindBoost.cmake
ha tenido algunos errores en el pasado. Una cosa que puede intentar es tomar una versión más nuevaFindBoost.cmake
de la última versión de CMake y pegarla en la carpeta de su proyecto al ladoCMakeLists.txt
; luego, incluso si tiene una versión anterior de boost, usará la nueva versiónFindBoost.cmake
que está en la carpeta de su proyecto.Buena suerte.
fuente
Yo mismo luché con este problema por un tiempo. Resultó que
cmake
estaba 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 usandoGCC 4.9.1
, y esa versión del compilador estaba presente en nuestro sistema; sin embargo,GCC 4.4.7
también pasó a estar instalado. Da la casualidad que elFindBoost.cmake
script de cmake detectaba automáticamente laGCC 4.4.7
instalación en lugar de laGCC 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
" enCMakeLists.txt
. Con este cambio,FindBoost.cmake
busqué y encontré mis archivos de biblioteca de Boost.fuente
También puede especificar la versión de Boost que le gustaría que CMake use pasando
-DBOOST_INCLUDEDIR
o-DBOOST_ROOT
apuntando a la ubicación de los encabezados de boost de la versión correctaEjemplo:
cmake -DBOOST_ROOT=/opt/latestboost
Esto también será útil cuando haya varias versiones de refuerzo en el mismo sistema.
fuente
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!
fuente
Tuve el mismo problema al intentar ejecutar
make
un 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
cmake
opciones y encontré lo siguiente: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.
fuente
Para que la versión de cmake se
3.1.0-rc2
recoja,boost 1.57
especifique-D_boost_TEST_VERSIONS=1.57
cmake version 3.1.0-rc2
por defectoboost<=1.56.0
es 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++
fuente
Si está creando su propio impulso, no olvide usar el; de lo
--layout=versioned
contrario, la búsqueda de una versión particular de la biblioteca fallaráfuente
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 tiempoBoost_DEBUG
muestra su valor. Lo que debe hacer aquí es marcar la casilla de verificación "Avanzado" y habilitarCGAL_Boost_USE_STATIC_LIBS
.fuente
Tuve el mismo problema y ninguna de las soluciones anteriores funcionó. En realidad, el archivo
include/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
fuente
Esto también puede suceder si
CMAKE_FIND_ROOT_PATH
se establece como diferente deBOOST_ROOT
. Enfrenté el mismo problema que, a pesar de la configuraciónBOOST_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_PATH
parece estar anulando loBOOST_ROOT
que estaba causando el problema.fuente
Tal vez
Te ayudará.
fuente