c++ - 现代 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。纠正此问题的最佳方法是什么?
解决方案
我已经设法使用 CMake 3.21 的$<TARGET_RUNTIME_DLLS:tgt>
生成器表达式部分解决了这个问题。但是,这仅在库tgt
链接正确设置为SHARED
. 理论上,这将处理所有依赖项。在现实生活中,很多包配置文件都是用UNKNOWN
类型而不是共享编写的,所以这些必须单独处理。
推荐阅读
- url - Google 搜索控制台在 url 末尾添加斜杠
- python-3.x - Python Openpyxl应用过滤器并删除所有可见行
- android - 在android studio中使用if语句后,我反复获取初始化值
- javascript - 如何在 Typescript 的嵌套对象中复制具有更新的对象?
- flutter - Flutter 错误:在应用程序中间放置一个 TabBar
- reactjs - 无法从事件触发功能
- python - 使用 Paramiko 在远程机器上执行命令无效
- elasticsearch - Kafka conect sink 中是否可以忽略空字符串字段
- xml - XSLT / XPATH:如何区分字符串值和节点()
- python - 如何通过特定文本查找元素 id 并单击它?