如何将DLL文件复制到与使用CMake的可执行文件相同的文件夹中?

我们使用CMake在我们的SVN中生成源代码的Visual Studio文件。 现在我的工具需要一些DLL文件与可执行文件在同一个文件夹中。 DLL文件位于源文件夹旁边。

我怎样才能改变我的CMakeLists.txt ,使生成的Visual Studio项目已经在释放/debugging文件夹中的特定DLL文件,或将编译时复制它们?

我会使用add_custom_commandcmake -E copy_if_different...一起实现此cmake -E copy_if_different... 。 完整的信息运行

 cmake --help-command add_custom_command cmake -E 

所以在你的情况下,如果你有以下的目录结构:

 /CMakeLists.txt /src /libs/test.dll 

并且该命令适用的CMake目标是MyTest ,那么可以将以下内容添加到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 

如果您只想复制/libs/目录的全部内容,请使用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>) 

如果您需要根据configuration(Release,Debug,例如)复制不同的dll,那么您可以在以相应的configuration命名的子目录中: /libs/Release/libs/Debug 。 然后您需要在add_custom_command调用中将configurationtypes注入到dll的path中,如下所示:

 add_custom_command(TARGET MyTest POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>" $<TARGET_FILE_DIR:MyTest>) 

我把这些行放在我的顶级CMakeLists.txt文件中。 所有的库和可执行文件将被放置在构build目录的顶层,这样可执行文件就可以find这些库,并且很容易运行。

 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 

接受答案的附录,作为一个单独的答案添加,所以我得到的代码格式:

如果你在同一个项目中构build你的dll,他们通常会在Release,Debug等目录中。 你将不得不使用Visual Studio环境variables来正确地复制它们。 例如:

 "${PROJECT_BINARY_DIR}/your_library/\$\(Configuration\)/your_library.dll" 

为来源和

 "${CMAKE_CURRENT_BINARY_DIR}/\$\(Configuration\)/your_library.dll" 

为目的地。 注意逃跑!

您不能在configuration中使用CMake CMAKE_BUILD_TYPEvariables,因为它在VS项目生成时已解决,并且始终是默认值。

您可能需要添加自定义目标,并使其依赖于您的可执行目标之一。 使用上述function使用复制文件

COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll

这对其中的一个很有用

 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)