¿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?
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:
También se puede utilizar la función
fetch_populate()
para especificar nombres personalizados para los objetivos Eigen y OpenCV: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.