windows - CMake no encuentra las librerías de Boost
(5)
Estoy intentando usar un script de CMake para compilar una aplicación basada en Boost en Windows. Las bibliotecas de solo encabezado funcionan bien, pero CMake no puede encontrar las bibliotecas (no se pudieron encontrar las siguientes bibliotecas de Boost: boost_serialization
). La parte relevante del script CMake es:
# Path where CMake can find additional libraries
SET(CMAKE_PREFIX_PATH Libs)
# Boost
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
SET(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS serialization)
Tengo una carpeta llamada "Libs" dentro de mi proyecto donde se almacenan bibliotecas de terceros como DevIL y Boost, así que configuro esto primero. Funciona bien para las cosas de solo encabezado de Devil y Boost, así que asumo que no debería necesitar la variable BOOST_ROOT. La instalación de Boost es la distribución de fuente estándar de boost.org que compilé con BJam . Las bibliotecas se almacenan en boost_1_47_0/bin.v2/libs
, y no boost_1_47_0/bin.v2/libs
nada en el proceso de compilación.
Creo que es un poco extraño que la carpeta boost_1_47_0/libs
no contenga ningún archivo de biblioteca, sino archivos BJam y otras cosas, pero eso no debería ser un problema ya que esta parece ser la forma normal de construir Boost en Windows desde la fuente.
Miré la salida de depuración del archivo FindBoost.cmake
(estoy usando la secuencia de comandos predeterminada de CMake 2.8) y parece que no se ve en bin.v2
. En su lugar, busca boost_ROOT/lib
, pero cuando copié el contenido de bin.v2/libs
a lib todavía no encontré nada.
Entonces, ¿cuál es una forma elegante de encontrar Boost que también funcionará en otras plataformas con distribuciones Boost comunes?
Bueno, resolví el problema, pero no estoy completamente satisfecho con mi solución.
En mi opinión, el problema era que BJam crea una estructura de carpetas demasiado compleja. Ahora solo copié los archivos de la biblioteca de "boost_1_47_0 / bin.v2 / libs / serialization / build / msvc-9.0 / debug / link-static / threading-multi" a "boost_1_47_0 / lib".
Tengo que hacer esto a mano, pero no estoy usando tantas bibliotecas de Boost, por lo que este paso está bien en mi opinión. Documentaré mi solución a un lado del script CMake, de modo que otros usuarios deberían llevarse bien con eso.
He tenido un problema con esto antes. Por alguna razón, b2 (también conocido como BJam) creó las bibliotecas Boost con una "lib" líder.
El script CMake no buscará un archivo llamado libboost_thread.lib
. Sólo encontrará boost_thread.lib
. Elimina la lib
libia y CMake debería encontrarlos.
Intentaría establecer BOOST_ROOT
dentro de su archivo CMakeLists.txt
. Sé que CMake 2.8.6 encontrará Boost 1.47.0 cuando establezca la variable Boost_ADDITIONAL_VERSIONS, ya que me funciona en Windows cuando tengo configurado BOOST_ROOT
.
Esto es lo que tengo en un proyecto:
set( BOOST_COMPONENTS_NEEDED serialization ) # The following verifyies that BOOST_ROOT is set properly. if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") FILE( TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT ) if( NOT EXISTS ${BOOST_ROOT} ) MESSAGE( STATUS ${BOOST_ROOT} " does not exist. Checking if BOOST_ROOT was a quoted string.." ) STRING( REPLACE "/"" "" BOOST_ROOT ${BOOST_ROOT} ) if( EXISTS ${BOOST_ROOT} ) MESSAGE( STATUS "After removing the quotes " ${BOOST_ROOT} " was now found by CMake" ) endif( EXISTS ${BOOST_ROOT}) endif( NOT EXISTS ${BOOST_ROOT} ) # Save the BOOST_ROOT in the cache if( NOT EXISTS ${BOOST_ROOT} ) MESSAGE( WARNING ${BOOST_ROOT} " does not exist." ) else(NOT EXISTS ${BOOST_ROOT}) SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "Set the value of BOOST_ROOT to point to the root folder of your boost install." FORCE) #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/Include) #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) endif( NOT EXISTS ${BOOST_ROOT} ) endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") if( WIN32 AND NOT BOOST_ROOT ) MESSAGE( WARNING "Please set the BOOST_ROOT environment variable." ) endif( WIN32 AND NOT BOOST_ROOT ) set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") set(Boost_DEBUG ON) set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) FIND_PACKAGE(Boost 1.47.0 COMPONENTS ${BOOST_COMPONENTS_NEEDED}) if(Boost_FOUND) MESSAGE( STATUS "Setting up boost." ) include_directories(${Boost_INCLUDE_DIRS}) if(Boost_DEBUG) MESSAGE( STATUS "BOOST Libraries " ${Boost_LIBRARIES} ) FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) STRING( TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE ) MESSAGE( STATUS "Boost " ${BOOST_COMPONENT} ": " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY} ) MESSAGE( STATUS "Boost " ${BOOST_COMPONENT} " Debug: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG} ) MESSAGE( STATUS "Boost " ${BOOST_COMPONENT} " Release: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE} ) ENDFOREACH(BOOST_COMPONENT) endif(Boost_DEBUG) endif(Boost_FOUND)
Puede agregar la siguiente opción a la línea de comandos de CMake para decirle a CGAL que use las bibliotecas estáticas de Boost:
-DCGAL_Boost_USE_STATIC_LIBS=true
Vine aquí con un problema similar y solo quería decir que mi solución era similar, pero no exactamente igual.
Mi prefijo de instalación era C:/lib/boost/boost_1_57_0
. Establecí una variable de entorno BOOST_ROOT
que apunta a ese directorio, pero CMake (3.1.0) aún no pudo encontrar los encabezados. Me di cuenta de que los encabezados predeterminados para instalar en C:/lib/boost/boost_1_57_0/include/boost-1_57/boost
. No voy a ejecutar varias versiones, así que bajé el directorio final de Boost uno, quité el directorio boost-1_57
y terminé con encabezados aquí:
C:/lib/boost/boost_1_57_0/include/boost
Y CMake lo encontró todo.