gpt4 book ai didi

c++ - 生成器表达式 cmake : copying works in debug but not release mode

转载 作者:行者123 更新时间:2023-11-30 03:42:12 25 4
gpt4 key购买 nike

我想弄清楚如何根据 cmake 中的配置复制一些库。

我试过这个:

add_custom_command(TARGET Myapp
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<$<CONFIG:Debug>:${_LIBS_DEBUG}>
$<$<CONFIG:Release>:${_LIBS_RELEASE}>
$<TARGET_FILE_DIR:MyApp>)

它在 Debug 中复制库,但在 release 中不复制:

  1. 这应该是合法的并且应该有效吗?
  2. 如果不合法(我没有报错),我怎样才能达到同样的效果?

最佳答案

将我的评论变成答案

调试这些案例我通常做的是添加另一个 COMMAND在只是回应命令行的实际问题行之前。在你的情况下:

COMMAND ${CMAKE_COMMAND} -E echo 
$<$<CONFIG:Debug>:${_LIBS_DEBUG}>
$<$<CONFIG:Release>:${_LIBS_RELEASE}>

我已经运行了几次测试,您会看到 $<1:...>$<0:...>不评估表达式。

所以看到这个我正在搜索 CMake 的错误跟踪器数据库,这是一个已知问题,但(对于 CMake 3.5.2)尚未解决:0009974: CMake should support custom commands that can vary by configuration.

此票证中提出了几种适用于现有 CMake 版本的方法。


在你的情况下 - 直到这个问题得到解决并且如果你想让它独立于外壳 - 我会用“老方法”做它并调用 CMake 脚本:

CopyLibsByConfig.cmake.in

if (_CONFIG STREQUAL "Debug")
file(COPY @_LIBS_DEBUG@ DESTINATION "${_DEST_PATH}")
else()
file(COPY @_LIBS_RELEASE@ DESTINATION "${_DEST_PATH}")
endif()

CMakeLists.txt

...
configure_file(CopyLibsByConfig.cmake.in CopyLibsByConfig.cmake @ONLY)
add_custom_command(TARGET MyApp
POST_BUILD
COMMAND ${CMAKE_COMMAND}
-D _CONFIG=$<CONFIG>
-D _DEST_PATH="$<TARGET_FILE_DIR:MyApp>"
-P "${CMAKE_CURRENT_BINARY_DIR}/CopyLibsByConfig.cmake"
)

但解决方案在很大程度上取决于您要复制到二进制输出文件夹的文件。有很多方法可以做到这一点,比如使用 install() :

install(FILES ${_LIBS_DEBUG} CONFIGURATIONS Debug DESTINATION $<TARGET_FILE_DIR:MyApp>)
install(FILES ${_LIBS_RELEASE} CONFIGURATIONS Release DESTINATION $<TARGET_FILE_DIR:MyApp>)

set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)

显然不是这样的install()是要使用的,所以考虑使用 INSTALLPACKAGE正确定位以分发您的应用程序及其所有依赖项。

如果我们谈论的是 Visual Studio 运行时 DLL,您很可能想看看 InstallRequiredSystemLibraries CMake 模块。

关于c++ - 生成器表达式 cmake : copying works in debug but not release mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36934605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com