2010-09-28 25 views
58

Estoy tratando de configurar un proyecto utilizando CMake, pero no puede encontrar las bibliotecas de Boost aunque 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?Cmake no encuentra Boost

Respuesta

81

¿Estás seguro de que lo estás haciendo de la manera correcta? La idea es que CMake establezca BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR y BOOST_ROOT automáticamente. Hacer algo como esto en CMakeLists.txt:

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

si el refuerzo no está instalado en una ubicación predeterminada y puede por lo tanto no puede encontrar cmake, se puede decir cmake dónde buscar impulso 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

+26

Es '$ {Boost_INCLUDE_DIR}' no '$ {BOOST_INCLUDE_DIR}', el caso es importante. –

+2

Quizás esto haya cambiado en las versiones más nuevas de cmake, pero aquí están los documentos de referencia: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html –

+2

no funciona para mí ... encuentra la biblioteca de impulso, pero genera toneladas de errores en el tiempo de compilación –

37

Hay más ayuda disponible leyendo el archivo FindBoost.cmake sí. Está ubicado en su directorio 'Módulos'.

Un buen comienzo es establecer (Boost_DEBUG 1) - esto generará una gran cantidad de información sobre dónde se ve el impulso, qué es lo que está buscando y puede ayudar a explicar por qué no puede encontrarlo.

También puede ayudarlo a determinar si retoma correctamente su BOOST_ROOT.

FindBoost.cmake también a veces tiene problemas si la versión exacta de boost no figura en las variables Versiones disponibles. Puede encontrar más información al leer FindBoost.cmake

Por último, FindBoost.cmake ha tenido algunos errores en el pasado. Una cosa que puede intentar es sacar una versión más reciente de FindBoost.cmake de la última versión de cmake, y pegarla en su carpeta de proyecto junto con CMakeLists.txt; incluso si tiene una versión anterior de boost, usará el nueva versión de FindBoost.cmake que está en la carpeta de su proyecto.

Buena suerte.

0

Un consejo más para cualquiera que intente construir CGAL en particular, con Boost estáticamente vinculado. No es suficiente definir Boost_USE_STATIC_LIBS; queda anulado en el momento en que Boost_DEBUG muestra su valor. Lo que hay que hacer aquí es marcar la casilla "Avanzado" y habilitar CGAL_Boost_USE_STATIC_LIBS.

2

Si usted está construyendo su propio impulso no se olvide de utilizar el --layout = versionado de lo contrario la búsqueda de una versión particular de la biblioteca fallará

3

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

1

Para la versión 3.1.0-RC2 cmake para recoger impulso 1,57 especifique -D_boost_TEST_VERSIONS = 1,57

versión cmake por defecto 3.1.0-RC2 para impulsar < = 1.56.0 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 ++

7

Luché con este problema por mi cuenta. Resultó que cmake estaba buscando archivos de la biblioteca Boost usando 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 compilarlo. Nuestras bibliotecas de Boost fueron construidas usando GCC 4.9.1, y esa versión del compilador estaba de hecho presente en nuestro sistema; sin embargo, también se instaló GCC 4.4.7. Da la casualidad que la secuencia de comandos de cmake FindBoost.cmake detectó automáticamente la instalación GCC 4.4.7 en lugar del GCC 4.9.1, y por lo tanto estaba buscando archivos de la biblioteca Boost con "gcc44" en los nombres de archivo, en lugar de "gcc49".

La solución simple era forzar a cmake a suponer que GCC 4.9 estaba presente, configurando Boost_COMPILER en "-gcc49" en CMakeLists.txt. Con este cambio, FindBoost.cmake buscó y encontró mis archivos de biblioteca de Boost.

1

También puede especificar la versión del impulso que le gustaría CMake para utilizar al pasar -DBOOST_INCLUDEDIR o -DBOOST_ROOT que apunta a la ubicación de la versión correcta cabeceras impulsar

Ejemplo:

cmake -DBOOST_ROOT=/opt/latestboost

Esto también será útil cuando hay múltiples versiones de refuerzo en el mismo sistema.

0

Tuve el mismo problema al intentar ejecutar make para un proyecto después de instalar la versión 1.66.0 de Boost en Ubuntu Trusty64. El mensaje de error es similar a (no exactamente) éste:

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 fue definitivamente instalado, pero CMake no pudo detectarlo. Después de pasar un montón de tiempo jugando con los caminos y las variables ambientales, que finalmente terminamos el registro de cmake sí para las opciones y encontré lo siguiente:

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

por lo que corrí lo siguiente en el directorio en cuestión:

sudo cmake --check-system-vars

que volvió:

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 resuelva el problema.