首页 文章

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

提问于
浏览
82

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

如何更改我的 CMakeLists.txt ,以便生成的Visual Studio项目已经在发布/调试文件夹中已经有特定的DLL文件,或者在编译时复制它们?

6 回答

  • 102

    我将使用 add_custom_commandcmake -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>)
    

    如果您需要根据配置(Release,Debug等)复制不同的dll,那么您可以使用相应的配置命名子目录: /libs/Release/libs/Debug . 然后,您需要将配置类型注入 add_custom_command 调用中的dll路径,如下所示:

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

    我把这些行放在我的顶级CMakeLists.txt文件中 . 由CMake编译的所有库和可执行文件都将放置在构建目录的顶层,以便可执行文件可以找到库并且很容易运行所有内容 .

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

    请注意,这并不能解决OP从项目源目录复制预编译二进制文件的问题 .

  • 5

    接受答案的附录,作为单独的答案添加,以便我获得代码格式:

    如果要在同一个项目中构建dll,它们通常位于Release,Debug等目录中 . 您必须使用Visual Studio环境变量来正确复制它们 . 例如 . :

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

    对于来源和

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

    为目的地 . 注意逃跑!

    您不能将CMake CMAKE_BUILD_TYPE变量用于配置,因为它在VS项目生成时解析,并且始终是默认值 .

  • 1

    这对其中一个很有用

    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)
    
  • 2

    您可能需要add custom target并使其依赖于您的一个可执行目标 . 使用上面的功能复制文件使用

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

  • -1

    您还可以使用命令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})
    

相关问题