求助:如何编译不依赖VC++运行时的OpenCV 4.6.0
问题分析与解决方案
关于VS2022编译产物依赖VCRUNTIME140.dll的原因
VS2022对应的MSVC工具集版本是v143,但从VS2015开始,微软统一了VC++运行时的主版本号为14.x,后续所有VS版本(2017/2019/2022)的运行时都延续这个主版本,仅在小版本上迭代更新。所以你看到编译产物依赖VCRUNTIME140.dll是正常现象,这和VS2022的版本号17并不冲突。
让opencv_world460.dll不依赖动态VC++运行时的步骤
你之前取消勾选BUILD_WITH_STATIC_CRT是操作反了,这个选项的核心作用就是让OpenCV链接静态版本的VC++运行时,正确操作配合以下步骤即可解决问题:
- 彻底清理CMake缓存:删除之前生成的build目录,重新创建空目录开始配置,避免旧设置残留干扰后续编译。
- 在CMake-GUI中勾选
BUILD_WITH_STATIC_CRT选项:该选项会强制OpenCV使用静态CRT,编译后产物将不再依赖动态的VCRUNTIMExxx.DLL。 - 手动指定
CMAKE_MSVC_RUNTIME_LIBRARY变量:如果BUILD_WITH_STATIC_CRT未生效,可直接在CMake的"Add Entry"中添加该变量,Release模式设置为MultiThreaded,Debug模式设置为MultiThreadedDebug,确保覆盖默认的动态CRT配置。 - 检查第三方依赖模块:若开启了OpenCV的第三方依赖(如FFmpeg、IPP等),需确保这些模块也是用静态CRT编译的,或者直接禁用不需要的模块(比如取消勾选
WITH_FFMPEG),否则第三方模块的动态CRT依赖会传递到最终的opencv_world.dll中。 - 重新生成解决方案并编译:配置完成后点击"Generate"生成VS工程,用VS2022打开工程,选择对应Release/Debug模式完成编译。
编译完成后,可通过dumpbin /dependents opencv_world460.dll命令检查依赖列表,确认VCRUNTIMExxx.DLL已被移除。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

