首页 > 解决方案 > 现代 CMake:您如何处理 Windows 上的 .dll 文件?

问题描述

我目前正在将 Linux 代码库移植到 Windows 上。我终于把所有东西都编译和运行了,除了一件事:我不知道如何处理 .dll 文件。到目前为止,我一直在手动复制它们,因为我正在处理单个 cmake 配置,但这远非理想。

所以我的问题是:如何使我的可执行文件与 CMake 一起工作?据我了解,DLL 文件必须在同一个目录中,所以我可能需要复制它们,但我不明白正确的方法。我一直在谷歌搜索,结果不是很令人满意(通常他们有特定库的代码片段,而且看起来相对“快速而肮脏”)。

我有多个依赖项需要从中获取 dll,最值得注意的是 OpenCV、Qt、openssl 等。

有没有办法以“通用”方式进行,例如从导入的目标获取属性并复制它?我真的不想明确列出每一个 .dll ......

在我的 CMakeLists 中,我使用Find_Package和使用target_link_libraries导入的目标来处理我的依赖项。

我只是想知道最好的方法是什么,或者我是否在做一些根本错误的事情。

编辑:考虑以下 CMakeLists.txt:

cmake_minimum_required (VERSION 3.8)

project ("OpenCV_HelloWorld")

find_package(OpenCV 4.4.0 REQUIRED COMPONENTS core imgproc video)


# Add source to this project's executable.
add_executable (OpenCV_HelloWorld OpenCV_HelloWorld.cpp OpenCV_HelloWorld.h) # pretty much empty files, the main just declares a cv::Mat
target_link_libraries(OpenCV_HelloWorld ${OpenCV_LIBS} )

这可以正确编译,但是,当尝试运行它时,我收到一条消息,说我需要 opencv_core440.dll。纠正此问题的最佳方法是什么?

标签: c++windowscmake

解决方案


我已经设法使用 CMake 3.21 的$<TARGET_RUNTIME_DLLS:tgt>生成器表达式部分解决了这个问题。但是,这仅在库tgt链接正确设置为SHARED. 理论上,这将处理所有依赖项。在现实生活中,很多包配置文件都是用UNKNOWN类型而不是共享编写的,所以这些必须单独处理。


推荐阅读