¿Cómo puedo obtener CMake para encontrar mi instalación alternativa de Boost?

He instalado la versión más reciente de Boost en /usr/local (con inclusiones en /usr/local/include/boost y bibliotecas en /usr/local/lib/boost ) y ahora bash instalar Wt desde el origen, pero CMake (versión 2.6) no parece encontrar la instalación de Boost. Intenta dar sugerencias útiles sobre la configuración de BOOST_DIR y Boost_LIBRARYDIR, pero no he podido hacer que funcione al ajustar estas variables.

El mensaje de error más reciente que recibo es que no puede encontrar las bibliotecas, pero parece indicar que está utilizando “/ usr / local / include” para la ruta include, que no es correcta (y puedo hacerlo) parece arreglarlo). ¿Hay alguna solución para esto en la parte superior de su cabeza, o tengo que ir a husmear dentro de CMake para resolverlo?

Debería echar un vistazo al script FindBoost.cmake , que maneja la detección de Boost y configura todas las variables de Boost. Suele residir en /usr/share/cmake-2.6/Modules/ . En él, encontrarás documentación. Por ejemplo:

 # These last three variables are available also as environment variables: # # BOOST_ROOT or BOOSTROOT The preferred installation prefix for searching for # Boost. Set this if the module has problems finding # the proper Boost installation. # 

A diferencia de BOOST_ROOT, las variables a las que se refiere son en realidad variables que establece el módulo FindBoost. Tenga en cuenta que no tiene que (y probablemente tampoco desee) editar la configuración de su proyecto CMake para configurar BOOST_ROOT. En su lugar, debe usar la variable de entorno, por ejemplo, llamar

# BOOST_ROOT=/usr/local/... ccmake .

Finalmente pude obtener lo que quería con

 cmake -DCMAKE_INSTALL_PREFIX=$TARGET \ -DBoost_NO_BOOST_CMAKE=TRUE \ -DBoost_NO_SYSTEM_PATHS=TRUE \ -DBOOST_ROOT:PATHNAME=$TARGET \ -DBoost_LIBRARY_DIRS:FILEPATH=${TARGET}/lib 

Tuve un problema similar, cmake encontró que el proveedor solo instaló boost, pero mi clúster tiene una versión instalada localmente, que es lo que quería que usara. RHEL 6

De todos modos, parece que todas las BOOSTROOT , BOOST_ROOT , Boost_DIR se molestarían a menos que también se establezca Boost_NO_BOOST_CMAKE (por ejemplo, agregar a la línea cmd -DBoost_NO_BOOST_CMAKE=TRUE ).

(Reconozco la utilidad de CMake para multiplataforma, pero aún así puedo odiarlo).

La versión corta

Solo necesita BOOST_ROOT , pero va a querer desactivar la búsqueda en el sistema de su Boost local si tiene múltiples instalaciones o comstackción cruzada para iOS o Android. En cuyo caso, agregue Boost_NO_SYSTEM_PATHS a falso.

 set( BOOST_ROOT "" CACHE PATH "Boost library path" ) set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" ) 

Normalmente esto se pasa en la línea de comandos CMake usando la syntax -D=value .

La versión más larga

Oficialmente hablando, la página FindBoost indica que estas variables se deben usar para ‘dar pistas’ sobre la ubicación de Boost.

Este módulo lee sugerencias sobre ubicaciones de búsqueda de variables:

 BOOST_ROOT - Preferred installation prefix (or BOOSTROOT) BOOST_INCLUDEDIR - Preferred include directory eg /include BOOST_LIBRARYDIR - Preferred library directory eg /lib Boost_NO_SYSTEM_PATHS - Set to ON to disable searching in locations not specified by these hint variables. Default is OFF. Boost_ADDITIONAL_VERSIONS - List of Boost versions not known to this module (Boost install locations may contain the version) 

Esto hace un encantamiento teóricamente correcto:

 cmake -DBoost_NO_SYSTEM_PATHS=TRUE \ -DBOOST_ROOT=/path/to/boost-dir 

Cuando comstacks desde la fuente

 include( ExternalProject ) set( boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2" ) set( boost_SHA1 "9f1dd4fa364a3e3156a77dc17aa562ef06404ff6" ) set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost ) set( boost_INCLUDE_DIR ${boost_INSTALL}/include ) set( boost_LIB_DIR ${boost_INSTALL}/lib ) ExternalProject_Add( boost PREFIX boost URL ${boost_URL} URL_HASH SHA1=${boost_SHA1} BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh --with-libraries=filesystem --with-libraries=system --with-libraries=date_time --prefix= BUILD_COMMAND ./b2 install link=static variant=release threading=multi runtime-link=static INSTALL_COMMAND "" INSTALL_DIR ${boost_INSTALL} ) set( Boost_LIBRARIES ${boost_LIB_DIR}/libboost_filesystem.a ${boost_LIB_DIR}/libboost_system.a ${boost_LIB_DIR}/libboost_date_time.a ) message( STATUS "Boost static libs: " ${Boost_LIBRARIES} ) 

Luego, cuando llame a este script, deberá incluir el script boost.cmake (el mío está en el subdirectorio a), incluir los encabezados, indicar la dependencia y vincular las bibliotecas.

 include( boost ) include_directories( ${boost_INCLUDE_DIR} ) add_dependencies( MyProject boost ) target_link_libraries( MyProject ${Boost_LIBRARIES} ) 

En general, el error más común es NO LIMPIEZA DE SU DIRECCIÓN DE CONSTRUCCIÓN después de agregar nuevas opciones. Tengo Boost instalado desde el administrador de paquetes del sistema. Su versión es 1.49. También descargué Boost 1.53 y lo “instalé” en $HOME/installs .

Lo único que tuve que hacer en mi proyecto fue: ( my_project_directory/src fonts en my_project_directory/src )

 cd my_project_directory mkdir build cd build cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src 

Y eso es. Ta bum tss.

Pero si lo hiciera después de cd build -> cmake ../src , establecería Boost desde la ruta del sistema. Luego, hacer cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src no cambiaría nada.

TIENE QUE LIMPIAR SU DIRECTORIO DE CONSTRUCCIÓN. ( cd build && rm -rf * ;))

Hay un método genérico para dar instrucciones sobre dónde encontrar libs.

Cuando se busca una lib, cmake se ve primero en las siguientes variables:

  • CMAKE_LIBRARY_PATH y LD_LIBRARY_PATH para bibliotecas
  • CMAKE_INCLUDE_PATH e INCLUDE_PATH para incluye

Si declaras tus archivos boost en uno de los archivos env, cmake lo encontrará. Ejemplo:

 export CMAKE_LIBRARY_PATH="/stuff/lib.boost.1.52/lib:$CMAKE_LIBRARY_PATH" export CMAKE_INCLUDE_PATH="/stuff/lib.boost.1.52/include:$CMAKE_INCLUDE_PATH" 

Si es demasiado engorroso, también puede usar una buena herramienta de instalación que escribí que hará todo por usted: administrador de versiones de C ++

Tuve un problema similar y pude usar bibliotecas de impulso personalizadas agregando líneas de bewlow a mi CMakeLists.txt:

 set(Boost_NO_SYSTEM_PATHS TRUE) if (Boost_NO_SYSTEM_PATHS) set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost") set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include") set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib") endif (Boost_NO_SYSTEM_PATHS) find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options) include_directories(${BOOST_INCLUDE_DIRS}) 

Después de investigar en cmake y experimentar, determiné que cmake estaba contento con el hecho de que todas mis bibliotecas de boost estaban contenidas en /usr/local/lib/boost y no /usr/local/lib . Una vez que los retiré suavemente, la comstackción funcionó.

También me encontré con el mismo problema, intentar las pistas aquí no ayuda, desafortunadamente. Lo único que se ayudó fue descargar la última versión de la página de impulso, comstackrla e instalarla como se describe aquí: http://piyushparkash.blogspot.de/2012/10/installing-boost-150-in-ubuntu-1210.html

en mi caso, trabajé con boost 1.53.

Pasé la mayor parte de la tarde tratando de hacer que esto funcionara. Intenté todo el -DBOOST_ * & c. directivas con CMake, pero siguió vinculándose a las bibliotecas de Boost de mi sistema, incluso después de borrar y reconfigurar mi área de comstackción repetidamente.

Al final modifiqué el Makefile generado y anulé el objective cmake_check_build_system para no hacer nada (como ‘echo’ ” ‘) para que no sobrescribiera mis cambios cuando ejecuté make, y luego hice’ grep -rl ‘lboost_python’ ‘* | xargs sed -i “s: -lboost_python: -L / opt / sw / gcc5 / usr / lib / -lboost_python: g ‘en mi comstackción / directorio para apuntar explícitamente todos los comandos de comstackción a la instalación de Boost que quería usar. Finalmente , eso funciono.

Reconozco que es un error feo , pero lo estoy exponiendo aquí para el beneficio de aquellos que se enfrentan contra la misma pared de ladrillos, y solo quieren evitarlo y hacer el trabajo.

Mientras configure podría encontrar mi instalación de refuerzo, cmake no pudo.

Localice FindBoost.cmake y busque LIBRARY_HINTS para ver qué subpaquetes está buscando. En mi caso, quería las libs mpi y graph.

  # Compute component-specific hints. set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "") if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR ${COMPONENT} STREQUAL "graph_parallel") foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES}) if(IS_ABSOLUTE "${lib}") get_filename_component(libdir "${lib}" PATH) string(REPLACE "\\" "/" libdir "${libdir}") list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir}) endif() endforeach() endif() 

búsqueda apt-cache … Instalé los paquetes dev desde que construí el código, y el paquete dev arrastra todas las dependencias. No estoy tan seguro de que una instalación de impulso estándar necesite openmpi, pero por ahora está bien.

 sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev sudo apt-get install libboost-graph-parallel-dev 

Me encontré con un problema similar en un servidor Linux, donde se han instalado dos versiones de Boost. Una es la versión 1.53.0 precomstackda que cuenta como vieja en 2018; está en /usr/include y /usr/lib64 . La versión que quiero usar es 1.67.0, ya que se requiere una versión mínima de 1.65.1 para otra biblioteca de C ++ que estoy instalando; está en /opt/boost , que tiene subdirectorios include y lib . Como se sugirió en las respuestas anteriores, establecí las variables en CMakeLists.txt para especificar dónde buscar Boost 1.67.0 de la siguiente manera

 include_directories(/opt/boost/include/) include_directories(/opt/boost/lib/) set(BOOST_ROOT /opt/boost/) set(BOOST_INCLUDEDIR /opt/boost/include/) set(BOOST_LIBRARYDIR /opt/boost/lib) set(Boost_NO_SYSTEM_PATHS TRUE) set(Boost_NO_BOOST_CMAKE TRUE) 

Pero CMake no respeta esos cambios. Luego encontré un artículo en línea: CMake puede usar un Boost local y se dio cuenta de que necesito cambiar las variables en CMakeCache.txt . Allí encontré que las variables relacionadas con Boost todavía apuntan al Boost 1.53.0 predeterminado, por lo que no es de extrañar que CMake no CMakeLists.txt mis cambios en CMakeLists.txt . Luego configuro las variables relacionadas con Boost en CMakeCache.txt

 Boost_DIR:PATH=Boost_DIR-NOTFOUND Boost_INCLUDE_DIR:PATH=/opt/boost/include/ Boost_LIBRARY_DIR_DEBUG:PATH=/opt/boost/lib Boost_LIBRARY_DIR_RELEASE:PATH=/opt/boost/lib 

También cambié las variables que apuntan a las partes comstackdas sin encabezado de la biblioteca Boost para apuntar a la versión que deseo. Entonces CMake construyó con éxito la biblioteca que depende de una versión reciente de Boost.