es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

CMake: find_package() sin instalar la dependencia

Tengo un proyecto de cmake. La estructura es algo así:

SharedLib
- lib1
- lib2

Donde lib2 depende de lib1, de tal manera que en su archivo CMakeLists.txt, utiliza find_package(lib1 REQUIRED). Ambas librerías son estáticas, y tanto SharedLib como lib2 usan lib1.

El archivo CMakeLists.txt principal es:

add_subdirectory("mypath/lib1" ${CMAKE_BINARY_DIR}/lib1)
add_subdirectory("mypath/lib2" ${CMAKE_BINARY_DIR}/lib2)

Ahora, find_package() falla durante la configuración ya que lib1 no está compilada en este punto, ni instalada en un lugar que cmake pueda encontrar.

La pregunta es, ¿cómo puedo hacer que find_package() encuentre mi lib1, que está en el proyecto, con el código fuente?


Nota: si es relevante, lib1 es zlib y lib2 es libzip.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una solución es utilizar la función ExternalProject_Add en CMake para construir e instalar lib1. Esta función permite descargar o clonar el código fuente de un proyecto externo, construirlo como un proyecto separado e instalarlo en un directorio que tú puedas especificar. Luego puedes usar find_package() para encontrar tu lib1 instalada. Aquí tienes un ejemplo de cómo puedes modificar tu archivo CMakeLists.txt de nivel superior para utilizar ExternalProject_Add:

    include(ExternalProject)
    
    # Construir e instalar lib1
    ExternalProject_Add(lib1_project
        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mypath/lib1
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/lib1
    )
    # Asegúrate de que lib2 dependa de lib1_project
    add_dependencies(lib2 lib1_project)
    
    # Agregar lib1 a los directorios de inclusión y enlazar contra ella
    include_directories(${CMAKE_CURRENT_BINARY_DIR}/lib1/include)
    link_directories(${CMAKE_CURRENT_BINARY_DIR}/lib1/lib)
    target_link_libraries(SharedLib lib1)
    target_link_libraries(lib2 lib1)
    
    # Encontrar lib1
    find_package(lib1 REQUIRED)
    

    Este código primero incluye el módulo ExternalProject y luego define un nuevo proyecto externo llamado lib1_project. El argumento SOURCE_DIR apunta al código fuente de lib1, y el argumento CMAKE_ARGS establece el prefijo de instalación en ${CMAKE_CURRENT_BINARY_DIR}/lib1. Esto significa que lib1 se instalará en ${CMAKE_CURRENT_BINARY_DIR}/lib1/include y ${CMAKE_CURRENT_BINARY_DIR}/lib1/lib. Luego, el código agrega lib1_project como una dependencia de lib2 para que lib1 se construya antes de lib2.

    El código también agrega ${CMAKE_CURRENT_BINARY_DIR}/lib1/include a los directorios de inclusión y ${CMAKE_CURRENT_BINARY_DIR}/lib1/lib a los directorios de enlace de SharedLib y lib2. Esto asegura que lib1 se encuentre en tiempo de enlace. Finalmente, el código llama a find_package() para asegurarse de que lib1 sea encontrada por otros proyectos que dependen de SharedLib.

    Ten en cuenta que esta solución asume que tienes acceso de escritura a lib1 y puedes modificar su archivo CMakeLists.txt para utilizar ExternalProject_Add. También asume que lib1 tiene un archivo CMakeLists.txt estándar que puede ser construido usando CMake. Si lib1 no se construye ya utilizando CMake o tiene requisitos de construcción no estándar, es posible que necesites modificar los argumentos de ExternalProject_Add para construirlo correctamente.

Comments are closed.