tutorial script not instalar found course como cant c++ windows cmake

c++ - script - cmake-find_library-ubicación de biblioteca personalizada



cmake windows tutorial (6)

La solución más sencilla 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 recomendaría encarecidamente usar el módulo estándar FindBoost y configurar la variable BOOST_DIR para que apunte a sus bibliotecas Boost.

Actualmente estoy intentando que CMake se ejecute para mi proyecto (en Windows). Quiero usar una ubicación personalizada donde están instaladas todas las bibliotecas. Para informar a CMake sobre ese camino intenté hacer eso:

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 configuro mi ruta de prefijo a

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

... se encuentra la biblioteca.

Entonces, mi pregunta es: ¿Cómo puedo configurar CMake correctamente para trabajar con una estructura de directorios en una ubicación personalizada que se parece a esto?

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

En "include" se encuentran los encabezados públicos y en "lib" están las bibliotecas compiladas.

Espero que alguien me pueda ayudar - Gracias de antemano

edición: la solución actual para mí es hacer esto antes de buscar 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 predeterminado para boost no lo encontrará hasta que la estructura de directorios de boost sea un poco diferente.

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

Cuando muevo el contenido, si se puede encontrar "boost-1_50" para "incluir" la biblioteca, no es posible manejar varias versiones, ¿no?


Me he encontrado con un escenario similar. Lo resolví agregando este código siguiente justo antes de find_library() :

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

entonces puede encontrar la ubicación de la biblioteca.


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

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

  2. Establezca la variable de entorno global CMAKE_PREFIX_PATH en D:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;... Cuando ejecute CMake, automáticamente recogerá esta variable y rellenará su propia CMAKE_PREFIX_PATH .

  3. Escriba un script .bat de envoltura, que llamaría comando cmake con el -D CMAKE_PREFIX_PATH=...


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

De la documentation CMAKE:

Para cada ruta en la lista CMAKE_PREFIX_PATH, CMake verificará "PATH / include" y "PATH" cuando se llame a FIND_PATH (), "PATH / bin" y "PATH" cuando se llame a FIND_PROGRAM (), y "PATH / lib y" PATH "cuando se llama a FIND_LIBRARY ().


Use CMAKE_PREFIX_PATH agregando múltiples rutas (separadas por punto y coma y sin espacios en blanco ). Puede configurarlo como una variable de entorno para evitar tener rutas absolutas en sus archivos de configuración de cmake

Tenga en cuenta que cmake buscará el archivo de configuración en cualquiera de las siguientes carpetas donde se encuentra cualquiera de las rutas en CMAKE_PREFIX_PATH y nombre es el nombre de la biblioteca que está buscando

<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 su caso, debe agregar a CMAKE_PREFIX_PATH las siguientes dos rutas:

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


Vi que dos personas hacían esa pregunta a sus favoritos, así que intentaré responder a la solución que me funciona: en lugar de usar los módulos de búsqueda, estoy escribiendo archivos de configuración para todas las bibliotecas que están instaladas. Esos archivos son extremadamente simples y también pueden usarse para establecer variables no estándar. CMake buscará (al menos en Windows) esos 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 impulso está en la ruta

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

En esa configuración puede establecer variables. Mi archivo de configuración para boost se ve así:

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 aún más el tamaño de los archivos de configuración cuando escribes algunas funciones de ayuda. El único problema que tengo con esta configuración es que no he encontrado una manera de dar prioridad a los archivos de configuración sobre los módulos de búsqueda, por lo que debe eliminar los módulos de búsqueda.

Espero que esto sea útil para otras personas.