linux boost cmake build-automation wt

linux - ¿Cómo puedo obtener cmake para encontrar mi instalación alternativa de impulso?



boost build-automation (11)

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 compilació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 sintaxis -D<VAR>=value

La versión más larga

Oficialmente hablando, la página de FindBoost indica que estas variables se deben usar para ''insinuar'' la ubicación del impulso.

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

BOOST_ROOT - Preferred installation prefix (or BOOSTROOT) BOOST_INCLUDEDIR - Preferred include directory e.g. <prefix>/include BOOST_LIBRARYDIR - Preferred library directory e.g. <prefix>/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 compilas 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=<INSTALL_DIR> 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} )

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 intento instalar Wt desde el origen, pero No parece que cmake (versión 2.6) encuentre la instalación de impulso. 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). ¿Alguien tiene una solución para esto fuera de la cabeza, o tengo que ir a hurgar 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 .


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 compilación funcionó.


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 fuentes 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 * ;))


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


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 ++


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


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 construcción repetidamente. Al final modifiqué el Makefile generado y anulé el objetivo 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 compilación / directorio para apuntar explícitamente todos los comandos de compilació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.



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})


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).