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 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í?

Tags:  , , ,

Answer

  1. Avatar for 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 mediante Conan y se han utilizado con CMake. Quiero copiar todas las dependencias transitivas de mi objetivo tgt utilizando expresiones generadas por CMake. Sin embargo, cuando intento hacerlo, el archivo fmt::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 por TARGET_RUNTIME_DLLS y Conan establece IMPORTED_LOCATION en .../lib/fmtd.lib en los objetivos de referencia de fmt::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.

Comments are closed.