首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用CMake将DLL文件复制到与可执行文件相同的文件夹中?

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

Stack Overflow用户
提问于 2012-05-20 16:24:11
回答 9查看 81.9K关注 0票数 115

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

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-05-20 18:44:43

我会和cmake -E copy_if_different...一起使用add_custom_command来实现这一点。要获取完整信息,请运行

代码语言:javascript
复制
cmake --help-command add_custom_command
cmake -E

因此,在您的示例中,如果您具有以下目录结构:

代码语言:javascript
复制
/CMakeLists.txt
/src
/libs/test.dll

并且应用该命令的CMake目标是MyTest,则可以在CMakeLists.txt中添加以下内容:

代码语言:javascript
复制
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

代码语言:javascript
复制
add_custom_command(TARGET MyTest POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        "${PROJECT_SOURCE_DIR}/libs"
        $<TARGET_FILE_DIR:MyTest>)

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

代码语言:javascript
复制
add_custom_command(TARGET MyTest POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        "${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
        $<TARGET_FILE_DIR:MyTest>)
票数 141
EN

Stack Overflow用户

发布于 2015-12-24 07:21:23

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

代码语言:javascript
复制
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

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

票数 27
EN

Stack Overflow用户

发布于 2014-11-18 06:45:54

接受答案的附录,作为单独的答案添加,这样我就可以得到代码格式:

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

代码语言:javascript
复制
"${PROJECT_BINARY_DIR}/your_library/\$\(Configuration\)/your_library.dll"

对于源代码和

代码语言:javascript
复制
"${CMAKE_CURRENT_BINARY_DIR}/\$\(Configuration\)/your_library.dll"

对于目的地。注意转义!

您不能将CMake CMAKE_BUILD_TYPE变量用于配置,因为它是在VS项目生成时解析的,并且将始终是任何缺省值。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10671916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档