[英]Generator expressions cmake: copying works in debug but not release mode
我想弄清楚如何根據 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>)
它在調試中復制庫但不在發布中:
把我的評論變成答案
我通常做的調試這些情況是在實際有問題的行之前添加另一個COMMAND
,它只是回顯命令行。 在你的情況下:
COMMAND ${CMAKE_COMMAND} -E echo
$<$<CONFIG:Debug>:${_LIBS_DEBUG}>
$<$<CONFIG:Release>:${_LIBS_RELEASE}>
我已經運行了一些測試,你會看到$<1:...>
和$<0:...>
表達式沒有被計算。
因此,看到這一點,我正在搜索 CMake 的錯誤跟蹤器數據庫,這是一個已知問題,但(對於 CMake 3.5.2)尚未解決: 0009974:CMake 應支持可因配置而異的自定義命令。
這張票中提出的幾種方法適用於現有版本的 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()
使用方式,因此請考慮正確使用INSTALL
或PACKAGE
目標來分發您的應用程序及其所有依賴項。
如果我們談論的是 Visual Studio 運行時 DLL,您很可能想查看InstallRequiredSystemLibraries CMake 模塊。
其他解決方案是使用generator expression 。
例如,我有cppzmq
(共享庫)和cppzmq-static
(具有靜態依賴項的靜態庫)。 我想要更快的調試版本,所以我在調試版本和(其他)版本中使用cppzmq
,例如我想要一個大的胖 exec。
target_link_libraries(CommunicationCommonLib PUBLIC
$<IF:$<CONFIG:Debug>,cppzmq,cppzmq-static>
Dexode::EventBus
gcpp
protobuf::libprotobuf
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.