如何DLL文件复制到同一文件夹中使用C进行可执行文件?如何DLL文件复制到同一文件夹中使用C进行可执

2019-05-14 08:49发布

我们使用CMake的为我们SVN生成我们的消息来源Visual Studio的文件。 现在我的工具需要一些DLL文件是在同一文件夹中的可执行文件。 该DLL文件是旁边的源文件夹中。

我怎样才能改变我CMakeLists.txt使得生成的Visual Studio项目要么已经在发行/调试文件夹中的特定DLL文件或将它们复制在编译时?

Answer 1:

我会用add_custom_command来一起实现这一目标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>)


如果您需要复制根据配置(发布,调试,如)不同的dll文件,那么你可以与相应的配置命名的子目录有这些/libs/Release ,和/libs/Debug 。 然后,您需要配置类型到路径注入到在该dll add_custom_command调用,就像这样:

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


Answer 2:

我把这些线在我的顶层的CMakeLists.txt文件。 通过CMake的编译所有的库和可执行文件将被放置在构建目录的顶层,这样的可执行文件可以找到库和很容易运行一切。

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

需要注意的是这并没有解决从项目的源代码目录复制预编译的二进制的OP的问题。



Answer 3:

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

如果您正在构建在同一项目中您的dll,他们通常会在发行,调试等目录。 你将不得不使用Visual Studio环境变量来正确地复制它们。 例如:

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

源和

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

为目的地。 注意逃逸!

你不能使用CMake的CMAKE_BUILD_TYPE变量的配置,因为它是在VS的项目生成时间解决,将永远是不管默认为。



Answer 4:

这对他们的一个非常有用

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)


Answer 5:

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

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



Answer 6:

您也可以使用命令find_library:

find_library(<some_var> NAMES <name_of_lib> PATHS "<path/to/lib>")

随着定义EXECUTABLE_PATH,例如:

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

你可以移动.dll文件可执行文件的需要,同

file(COPY ${<some_var>}
    DESTINATION ${EXECUTABLE_OUTPUT_PATH})


文章来源: How to copy DLL files into the same folder as the executable using CMake?
标签: dll cmake