gpt4 book ai didi

dll - 将可执行文件链接到的所有 dll 复制到可执行文件目录

转载 作者:行者123 更新时间:2023-12-02 22:18:37 25 4
gpt4 key购买 nike

This question询问类似的问题,但只需要手动指定要复制的 dll。我的问题是:有没有办法让 CMake 复制链接到可执行库的所有 dll,而无需手动告诉 CMake 要复制哪些文件?有时 CMake 更了解是否需要 dll。例如,在一个同时安装了同一个库(例如 Boost)的 dll 和静态库的系统中,我们选择静态链接到 Boost,那么我们就不需要复制 dll。因此 CMake 可以做出比手动指定要复制哪些文件更好的决定。另一个例子是,我的 QT 库链接到 ICU 库,在编写 CMakeLists.txt 时,我对此一无所知,所以我不可能告诉 CMake 复制 ICU dll,所以这应该由 CMake 而不是人类。

假设操作系统是 Windows。

最佳答案

从 CMake 3.21 开始,生成器表达式 $<TARGET_RUNTIME_DLLS:...> 很有帮助。它扩展为所有 SHARED 位置的路径列表(以未指定的顺序)传递依赖中的库。

add_library(lib1 ...)
add_library(lib2 ...)

find_package(lib3 REQUIRED)

add_executable(exe ...)
target_link_libraries(exe PRIVATE lib1 lib2 imported::lib3)

# The following variable is defined only on DLL systems
if (CMAKE_IMPORT_LIBRARY_SUFFIX)
add_custom_command(
TARGET exe POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:exe> $<TARGET_FILE_DIR:exe>
COMMAND_EXPAND_LISTS
)
endif ()

以上代码假设$<TARGET_RUNTIME_DLLS:...>不会为空,因此检查我们是否在 DLL 系统上(CMAKE_IMPORT_LIBRARY_SUFFIX 仅在这种情况下定义)。如果它 为空,命令将失败,因为没有足够的参数提供给cmake -E copy。 .我个人已经打开了一个关于这个糟糕的人体工程学的问题。 https://gitlab.kitware.com/cmake/cmake/-/issues/23543

请注意 $<TARGET_RUNTIME_DLLS:...>仅捕获 CMake 目标。这是一个很好的例子,说明为什么将 链接到 CMake 目标通常不是一个好主意,即使这意味着您自己创建一个导入的目标。


如果你发现你写了很多,你可以把它包装成一个函数:

function(copy_runtime_dlls TARGET)
get_property(already_applied TARGET "${TARGET}" PROPERTY _copy_runtime_dlls_applied)

if (CMAKE_IMPORT_LIBRARY_SUFFIX AND NOT already_applied)
add_custom_command(
TARGET "${TARGET}" POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy
"$<TARGET_RUNTIME_DLLS:${TARGET}>" "$<TARGET_FILE_DIR:${TARGET}>"
COMMAND_EXPAND_LISTS
)

set_property(TARGET "${TARGET}" PROPERTY _copy_runtime_dlls_applied 1)
endif ()
endfunction()

然后调用copy_runtime_dlls(exe)以上。

关于dll - 将可执行文件链接到的所有 dll 复制到可执行文件目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089284/

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