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.

¿Cómo puedo evitar las colisiones de nombres de destino al usar FetchContent de CMake?

Cuando uso CMake FetchContent para importar OpenCV, funciona bien:

include(FetchContent)

<h1>Obtener OpenCV</h1>

FetchContent_Declare(
        opencv
        GIT_REPOSITORY https://gitee.com/aiproach/opencv.git
        GIT_TAG        4.4.0
)
FetchContent_MakeAvailable(opencv)

set(OpenCV_DIR ${CMAKE_CURRENT_BINARY_DIR})
find_package(OpenCV REQUIRED)

Pero después de agregar Eigen:


<h1>Obtener Eigen</h1> FetchContent_Declare( eigen GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git GIT_TAG 3.3.9 ) FetchContent_MakeAvailable(eigen) find_package(eigen3 REQUIRED)

Emite errores:

CMake Error at build/_deps/eigen-src/CMakeLists.txt:620 (add_custom_target):
  add_custom_target cannot create target "uninstall" because another target
  with the same name already exists.  The existing target is a custom target
  created in source directory
  "...../build/_deps/opencv-src".
  See documentation for policy CMP0002 for more details.

CMake Error at build/_deps/eigen-build/eigen3Config.cmake:20 (include):
  The file

....../build/_deps/eigen-build/Eigen3Targets.cmake

was generated by the export() command.  It may not be used as the argument
  to the include() command.  Use ALIAS targets instead to refer to targets by
  alternative names.

Call Stack (most recent call first):
  CMakeLists.txt:30 (find_package)

Me dijeron que esto se debe a una colisión de espacios de nombres, pero no sé cómo resolver ese problema. Busqué “FetchContent” en GitHub, pero parece que todos lo están usando de la misma manera que yo. ¿Existe alguna forma general de obtener todo usando FetchContent con el esfuerzo de solo ingresar el nombre del proyecto y la URL?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Es probable que el problema se deba a la configuración de los archivos CMake de Eigen y OpenCV, los cuales entran en conflicto entre sí, resultando en colisión de espacios de nombres. Una forma de resolver este problema es renombrar manualmente los objetivos en conflicto o exportarlos con nombres diferentes.

    Una solución es modificar los archivos CMakeLists.txt de Eigen y OpenCV para renombrar los objetivos en conflicto. Otra solución es especificar explícitamente los nombres de los objetivos FetchContent utilizando la función fetch_populate().

    Por ejemplo, se podría modificar el código para usar nombres explícitos tanto para Eigen como para OpenCV:

    # Obtener Eigen con nombre de objetivo explícito
    FetchContent_Declare(
        Eigen
        GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
        GIT_TAG        3.3.9
    )
    FetchContent_Populate(Eigen)
    add_library(Eigen INTERFACE)
    target_include_directories(Eigen INTERFACE ${eigen_SOURCE_DIR})
    
    # Obtener OpenCV con nombre de objetivo explícito
    FetchContent_Declare(
        OpenCV
        GIT_REPOSITORY https://gitee.com/aiproach/opencv.git
        GIT_TAG        4.4.0
    )
    FetchContent_MakeAvailable(OpenCV)
    

    También se puede utilizar la función fetch_populate() para especificar nombres personalizados para los objetivos Eigen y OpenCV:

    # Obtener Eigen con nombre de objetivo personalizado
    FetchContent_Declare(
        myEigen
        GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
        GIT_TAG        3.3.9
    )
    FetchContent_Populate(myEigen)
    add_library(Eigen INTERFACE)
    target_include_directories(Eigen INTERFACE ${myEigen_SOURCE_DIR})
    
    # Obtener OpenCV con nombre de objetivo personalizado
    FetchContent_Declare(
        myOpenCV
        GIT_REPOSITORY https://gitee.com/aiproach/opencv.git
        GIT_TAG        4.4.0
    )
    FetchContent_MakeAvailable(myOpenCV)
    

    Utilizar nombres explícitos o personalizados para los objetivos FetchContent puede ayudar a evitar colisiones de espacios de nombres y facilitar la inclusión de múltiples dependencias utilizando FetchContent en el mismo proyecto.

Comments are closed.