2011-11-10 16 views
14

Estoy tratando de usar un cmake skript para compilar una aplicación basada en impulso en Windows. Las bibliotecas de cabecera sólo funcionan bien, pero cmakes no logra encontrar las librerías (Las siguientes bibliotecas Boost no se ha encontrado: boost_serialization) La parte pertinente de la secuencia de comandos cmake es:cmake no encuentra las bibliotecas de impulso

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

He 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 Devil y aumenta cosas solo de encabezado, así que supongo que no debería necesitar la variable BOOST_ROOT. La instalación de refuerzo 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, no cambié 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 costura es la forma normal de generar un impulso en Windows de la fuente.

Miré la salida de depuración de FindBoost.cmake (estoy usando la secuencia de comandos predeterminada de CMake 2.8) y no tiene sentido mirar en bin.v2. En su lugar, busca boost_ROOT/lib, pero cuando copié el contenido de bin.v2 \ libs a lib, todavía no encuentra nada.

Entonces, ¿qué es una forma elegante de encontrar impulso, que también funcionará en otras plataformas con distribuciones de bosst comunes?

Respuesta

5

Bueno, he resuelto el problema, pero no estoy totalmente satisfecho con mi solución. En mi opinión, el problema era que bjam creaba una estructura de carpetas compleja. Ahora acabo de copiar 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 muchas bibliotecas de refuerzo, por lo que este paso está bien en mi opinión. Documentaré mi solución a un lado del script cmake, para que otros usuarios se lleven bien con eso.

+5

Lea el manual, aprenda sobre el escenario y la instalación. – mloskot

+0

Leí el manual (http://www.boost.org/doc/libs/1_48_0/more/getting_started/windows.html) pero utilicé la opción 5.2. Encontré el directorio de escenario con todas las bibliotecas y ahora puedo configurarlo como mi directorio de biblioteca de refuerzo, pero la próxima vez probaré la opción 5.3. – JonathanK

+0

También puede simplemente copiar el directorio de etapas y de impulso (encabezados) para hacer su propia instalación de Boost. p.ej. boost/-> C: \ boost \ include \ boost y stage/* -> C: \ boost \ lib – mloskot

13

Intentaría establecer BOOST_ROOT dentro de su CMakeLists.txt. Sé que CMake 2.8.6 encontrará boost 1.47.0 cuando configure la variable Boost_ADDITIONAL_VERSIONS, ya que funciona en Windows cuando tengo BOOST_ROOT establecido.

Esto es lo que tengo en proyecto 1:

 

    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) 

+1

Esto me ayuda mucho, gracias por este script. Iba a una línea justo después del Boost_FOUND con esto: LINK_DIRECTORIES ($ {Boost_LIBRARY_DIRS}) de lo contrario, sigue diciendo que no se encontró la biblioteca. Espero que esto ayude a otros a tener el mismo problema. – Cross

+0

- NO se pudo encontrar Boost Versión de Boost: 1.60.0 Boost include path:/usr/include La versión detectada de Boost es demasiado antigua. La versión solicitada fue 1.64 (o más reciente). ..... Incluso al agregar lo que se menciona en el comentario anterior (Windows 10/CLion) –

1

que he tenido un problema con esto antes. Por alguna razón, b2 (aka bjam) creó las bibliotecas de impulso con una "lib" líder. El script cmake no buscará un archivo llamado libboost_thread.lib. Solo encontrará boost_thread.lib. Retire el lib líder y cmake debería encontrarlos.

+0

Lo intenté pero no sirvió Ahora el nombre es algo así como boost_serialization-vc90-mt-1_47.lib en lugar de libboost_serialization -vc90-mt-1_47.lib - y si quiero usar algunas bibliotecas más, realmente no quiero cambiarles el nombre para que cmake pueda encontrarlas. En mi opinión, find_package debería hacer todo el trabajo por mí ... – JonathanK

+3

No cambie el nombre de las libs. El prefijo "lib" es para libs estáticas, sin el prefijo es para DLL. Debes construir con runtime-link = shared en su lugar. –

+0

@AndreasHaferburg En mi caso, estaba tratando específicamente de aumentar el enlace estático en mi aplicación. –

0

Usted puede añadir la siguiente opción de la línea de comandos de cmake para contar CGAL utilizar las bibliotecas boost estático:

-DCGAL_Boost_USE_STATIC_LIBS=true 
0

Vine aquí con un problema similar y sólo quería decir mi dosis fue similar pero no exactamente lo mismo. 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 no se instalaron en C: \ lib \ boost \ boost_1_57_0 \ include \ boost-1_57 \ boost. No voy a ejecutar varias versiones así que acabo de mudar el directorio definitivo impulso hacia abajo uno y quité el directorio de impulso-1_57 y terminó con cabeceras aquí:

C:\lib\boost\boost_1_57_0\include\boost 

Y CMake conocer todo.

Cuestiones relacionadas