2012-08-22 14 views
34

Actualmente estoy tratando de ejecutar CMake para mi proyecto (en Windows). Quiero usar una ubicación personalizada donde estén todas las bibliotecas instaladas. CMake para informar sobre ese camino traté de hacer eso:cmake - find_library - ubicación personalizada de la biblioteca

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs) 

Pero cuando trato de encontrar la biblioteca con

find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static) 

CMake no puede encontrarlo. Cuando me juego mi camino prefijo a

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs/curl) 

... la biblioteca se encuentra.

Así que mi pregunta es: ¿Cómo puedo configurar CMake adecuadamente para trabajar con un structore directorio a la ubicación personalizada que se parece a lo siguiente:

D:/develop/cmake/libs/ 
-> libA 
    -> include 
    -> lib 
-> libB 
    -> include 
    -> lib 
-> ... 
    -> include 
    -> lib 

En "incluir" se encuentran las cabeceras públicos y en "lib "son las bibliotecas compiladas.

espero que alguien me puede ayudar - Gracias de antemano

edición: La solución actual para mí es, para hacer esto antes de que yo busco bibliotecas:

set(CUSTOM_LIBRARY_PATH D:/develop/cmake/libs) 
file(GLOB sub-dir ${CUSTOM_LIBRARY_PATH}/*) 
foreach(dir ${sub-dir}) 
    if(IS_DIRECTORY ${dir}) 
     set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${dir}) 
    endif() 
endforeach() 

Pero de esa manera el módulo por defecto para boost no lo encontrará hasta que la estructura del directorio de boost sea un poco diferente.

boost -> include -> boost-1_50 -> *.hpp 

Cuando muevo el contenido si "impulsar-1_50" a "incluir" la biblioteca se puede encontrar, pero de esa manera no es posible para manejar múltiples versiones verdad?

+1

En primer lugar, ¿por qué estás configurando CMAKE_PREFIX_PATH dentro CMakeLists.txt? Esto no funcionará si otro chico intentara compilar tu proyecto. – arrowd

+0

Fue solo para pruebas. Si funcionara, usaría una variable de entorno – Daniel

Respuesta

9

vi que dos personas ponen esa pregunta a sus favoritos así que voy a tratar de responder a la solución que funciona para mí: En lugar de utilizar los módulos hallazgo que estoy escribiendo archivos de configuración para todas las bibliotecas que se instalan. Esos archivos son extremadamente simples y también se pueden usar para establecer variables no estándar. CMake será (al menos en las ventanas) buscar los archivos de configuración en

CMAKE_PREFIX_PATH/<<package_name>>-<<version>>/<<package_name>>-config.cmake 

(que se puede establecer a través de una variable de entorno). Así, por ejemplo, la configuración de refuerzo es en la ruta de

CMAKE_PREFIX_PATH/boost-1_50/boost-config.cmake 

En esa configuración se puede establecer variables. Mi archivo de configuración para el impulso parece que:

set(boost_INCLUDE_DIRS ${boost_DIR}/include) 
set(boost_LIBRARY_DIR ${boost_DIR}/lib) 
foreach(component ${boost_FIND_COMPONENTS}) 
    set(boost_LIBRARIES ${boost_LIBRARIES} debug ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-gd-1_50.lib) 
    set(boost_LIBRARIES ${boost_LIBRARIES} optimized ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-1_50.lib) 
endforeach() 
add_definitions(-D_WIN32_WINNT=0x0501) 

bastante sencillo + es posible reducir el tamaño de la configuración de los archivos aún más cuando se escribe algunas funciones auxiliares. El único problema que tengo con esta configuración es que no he encontrado la manera de dar prioridad a los archivos de configuración sobre los módulos de búsqueda, por lo que debes eliminar los módulos de búsqueda.

Espero que esto sea útil para otras personas.

15

La solución más simple puede ser agregar HINTS a cada solicitud find_*.

Por ejemplo:

find_library(CURL_LIBRARY 
    NAMES curl curllib libcurl_imp curllib_static 
    HINTS "${CMAKE_PREFIX_PATH}/curl/lib" 
) 

Para Boost no te recomiendo usar el módulo estándar FindBoost y estableciendo la variable de BOOST_DIR para apuntar a sus bibliotecas Boost.

+0

. Hice una combinación de sugerencias + variables de entorno como BOOST_DIR para ayudar a cmake a encontrar mis bibliotecas en Windows. También para algunas bibliotecas si un módulo estándar no mira la variable de entorno, verifico en mi CMakeLists.txt si la variable de entorno está configurada pero la variable CMake está vacía y luego establezco la variable CMake que espera que ayude. – drescherjm

+0

La palabra clave HINTS hizo la tarea. En mi caso, estoy usando la biblioteca matemática libm.so de una carpeta local. Pero cada vez que compilé, lo tomó de la carpeta del sistema. Al usar la palabra clave HINTS y ​​al indicar la ruta de mi libm.so, pude vincular con éxito mi propia libm.so. – infoclogged

+0

Y cuando uso esta construcción, en el proyecto msvc generado recibo el error "CURL_LIBRARY.lib no encontrado". Me pregunto por qué intenta buscar la biblioteca por nombre de variable, pero lo hace. – Arkady

6

No hay forma de configurar automáticamente CMAKE_PREFIX_PATH de la manera que desee. Veo las siguientes formas de resolver este problema:

  1. Coloque todos los archivos de bibliotecas en el mismo directorio. Es decir, include/ contendría encabezados para todas las librerías, lib/ - binarios, etc. Para su información, este es el diseño común para la mayoría de los sistemas tipo UNIX.

  2. Establecer entorno global variable CMAKE_PREFIX_PATH a D:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;.... Cuando ejecutas CMake, automáticamente recogería este env var y llenaría su propio CMAKE_PREFIX_PATH.

  3. Escriba un script envoltorio .bat, que llamaría al comando cmake con el argumento -D CMAKE_PREFIX_PATH=....

0

Me he encontrado con un escenario similar. Lo resuelto mediante la adición en este siguiente código justo antes de find_library():

set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/) 

entonces se puede encontrar la ubicación de la biblioteca.

+2

'CMAKE_PREFIX_PATH' está destinado a ser configurado por el usuario (o quien llame a' cmake'). La codificación puede funcionar para usted, pero no en otros sistemas. – usr1234567

3

Tiene un nivel extra de anidamiento. CMAKE buscará en las listas $CMAKE_PREFIX_PATH/include para los encabezados y $CMAKE_PREFIX_PATH/libs para las bibliotecas.

De CMAKE documentation:

Para cada ruta en la lista CMAKE_PREFIX_PATH, CMake se compruebe "PATH/incluir" y "PATH" cuando se llama FIND_PATH(), "PATH/bin" y " PATH "cuando se llama FIND_PROGRAM(), y" PATH/lib y "PATH" cuando FIND_LIBRARY() se llama.

3

uso CMAKE_PREFIX_PATH mediante la adición de múltiples rutas (separados por punto y coma y no hay espacios en blanco). Usted puede s y como una variable ambiental para evitar tener rutas absolutas en los archivos de configuración cmake

en cuenta que cmake buscará el archivo de configuración en cualquiera de los following folders donde es cualquiera de la ruta en CMAKE_PREFIX_PATH y el nombre es el nombre de la biblioteca que busca

<prefix>/            (W) 
<prefix>/(cmake|CMake)/         (W) 
<prefix>/<name>*/          (W) 
<prefix>/<name>*/(cmake|CMake)/       (W) 
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/   (U) 
<prefix>/(lib/<arch>|lib|share)/<name>*/    (U) 
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (U) 

En el caso de tener que añadir a CMAKE_PREFIX_PATH las dos vías siguientes:

D:/develop/cmake/libs/libA;D:/develop/cmake/libB 
Cuestiones relacionadas