restaurar - programa para reparar archivos dll
Cómo copiar archivos DLL en la misma carpeta que el ejecutable usando CMake? (6)
Usamos CMake para generar los archivos de Visual Studio de nuestras fuentes en nuestro SVN. Ahora mi herramienta requiere que algunos archivos DLL estén en la misma carpeta que el ejecutable. Los archivos DLL se encuentran en una carpeta junto a la fuente.
¿Cómo puedo cambiar mi CMakeLists.txt
modo que el proyecto de Visual Studio generado ya tenga los archivos DLL particulares en las carpetas de liberación / depuración o los copie en la compilación?
Esto es útil para uno de ellos
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/lib CACHE
PATH "Directory where all the .lib files are dumped." FORCE)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/bin CACHE
PATH "Directory where .exe and .dll files are dumped." FORCE)
Probablemente necesites agregar un objetivo personalizado y hacerlo depender de uno de tus objetivos ejecutables. Para copiar el archivo usando el uso de la función anterior
COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll
.
Puse estas líneas en mi archivo CMakeLists.txt de nivel superior. Todas las bibliotecas y ejecutables se colocarán en el nivel superior del directorio de compilación para que los ejecutables puedan encontrar las bibliotecas y sea fácil ejecutar todo.
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
También puede usar el comando find_library:
find_library(<some_var> NAMES <name_of_lib> PATHS "<path/to/lib>")
Con un EXECUTABLE_PATH definido, por ejemplo:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
puedes mover los archivos .dll que tu ejecutable necesita, con
file(COPY ${<some_var>}
DESTINATION ${EXECUTABLE_OUTPUT_PATH})
Una adición a la respuesta aceptada, agregada como una respuesta separada para obtener el formato del código:
Si está creando sus dlls en el mismo proyecto, generalmente estarán en los directorios Release, Debug, etc. Tendrá que usar las variables de entorno de Visual Studio para copiarlas correctamente. p.ej:
"${PROJECT_BINARY_DIR}/your_library//$/(Configuration/)/your_library.dll"
para la fuente y
"${CMAKE_CURRENT_BINARY_DIR}//$/(Configuration/)/your_library.dll"
para el destino Tenga en cuenta el escaparse!
No puede usar la variable CMake CMAKE_BUILD_TYPE para la configuración, ya que se resuelve en el tiempo de generación del proyecto VS y siempre será el valor predeterminado.
add_custom_command
para lograr esto junto con cmake -E copy_if_different...
Para obtener información completa, ejecuta
cmake --help-command add_custom_command
cmake -E
Entonces en tu caso, si tienes la siguiente estructura de directorio:
/CMakeLists.txt
/src
/libs/test.dll
y su objetivo CMake al que se aplica el comando es MyTest
, luego puede agregar lo siguiente a su CMakeLists.txt:
add_custom_command(TARGET MyTest POST_BUILD # Adds a post-build event to MyTest
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
"${PROJECT_SOURCE_DIR}/libs/test.dll" # <--this is in-file
$<TARGET_FILE_DIR:MyTest>) # <--this is out-file path
Si solo desea que se copie todo el contenido del directorio /libs/
, use cmake -E copy_directory
:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs"
$<TARGET_FILE_DIR:MyTest>)
Si necesita copiar dlls diferentes según la configuración (Release, Debug, ej.), Puede tenerlos en subdirectorios nombrados con la configuración correspondiente: /libs/Release
y /libs/Debug
. Luego debe inyectar el tipo de configuración en la ruta al dll en la llamada add_custom_command
, de esta manera:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)