Cómo copiar DLLs de manera transitoria con cmake y Conan?
Tengo un proyecto de CMake en el que enlazo con fmt::fmt
, que está especificado en el conanfile.py y está instalado y todos los archivos de configuración de CMake han sido generados por Conan
y utilizados por CMake, hasta ahora todo bien. (Utilizo from conan.tools.cmake import CMakeDeps, CMakeToolchain, CMake
)
Intento copiar todas las dependencias transitivas de mi objetivo tgt
con https://cmake.org/cmake/help/git-stage/manual/cmake-generator-expressions.7.html#genex:TARGETRUNTIMEDLLS (Sé que existe la función de importación de conan, pero quería probarlo con CMake)
cmake
add_executable(exe main.c)
target_link_libraries(exe PRIVATE otherTarget fmt::fmt)
add_custom_command(TARGET exe POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:exe> $<TARGET_FILE_DIR:exe>
COMMAND_EXPAND_LISTS
)
Extrañamente, el archivo otherTarget.dll será copiado al ejecutable. Pero el archivo fmt::fmt dll
no se copia, ¿porque algo está configurado incorrectamente en los archivos generados? Sin embargo, Conan establece IMPORTED_LOCATION en el .../lib/fmtd.lib
en los objetivos de referencia de fmt::fmt
, y sospecho que CMake no lo incluye en TARGET_RUNTIME_DLLS
porque solo se tratan los archivos .dll
?
¿Alguien sabe qué está pasando aquí?
davy.ai
Pregunta:
Tengo un proyecto CMake donde enlazo con
fmt::fmt
, que está especificado en el archivo conanfile.py y se ha instalado y se han generado todos los archivos de configuración de CMake medianteConan
y se han utilizado con CMake. Quiero copiar todas las dependencias transitivas de mi objetivotgt
utilizando expresiones generadas por CMake. Sin embargo, cuando intento hacerlo, el archivofmt::fmt dll
no se copia. ¿Cuál podría ser el problema aquí?Solución:
Parece que el problema podría estar en el hecho de que solo los archivos
.dll
son tratados porTARGET_RUNTIME_DLLS
y Conan estableceIMPORTED_LOCATION
en.../lib/fmtd.lib
en los objetivos de referencia defmt::fmt
. Esto podría estar causando que el archivo dll no se copie. Una solución podría ser intentar utilizar la función de importación de Conan en lugar de las expresiones generadas por CMake para copiar las dependencias transitivas.