现代 CMake:您如何处理 Windows 上的 .dll 文件?
Modern CMake: How do you deal with .dll files on Windows?
我目前正在 Windows 上移植 Linux 代码库。我终于得到了所有要编译的东西 运行,除了一件事:我不知道如何处理 .dll 文件。到目前为止,我一直在手动复制它们,因为我正在处理单个 cmake 配置,但这远非理想。
所以我的问题是:如何使我的可执行文件与 CMake 一起工作?据我所知,DLL 文件必须在同一个目录中,所以我可能需要复制它们,但我不明白正确的方法。我一直在谷歌搜索,结果不是很令人满意(通常他们有特定库的代码片段,而且看起来相对 'quick and dirty')。
我有多个依赖项需要从中获取 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
类型编写的,而不是共享的,所以这些必须单独处理。
我目前正在 Windows 上移植 Linux 代码库。我终于得到了所有要编译的东西 运行,除了一件事:我不知道如何处理 .dll 文件。到目前为止,我一直在手动复制它们,因为我正在处理单个 cmake 配置,但这远非理想。
所以我的问题是:如何使我的可执行文件与 CMake 一起工作?据我所知,DLL 文件必须在同一个目录中,所以我可能需要复制它们,但我不明白正确的方法。我一直在谷歌搜索,结果不是很令人满意(通常他们有特定库的代码片段,而且看起来相对 'quick and dirty')。
我有多个依赖项需要从中获取 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
类型编写的,而不是共享的,所以这些必须单独处理。