如何将OpenCV与自研C++程序整合编译为单个独立DLL
VS2015环境下将OpenCV集成到单个DLL的实现方案
要实现将OpenCV依赖完全打包进你开发的DLL,核心思路是使用静态编译版本的OpenCV,将OpenCV的代码直接链接到你的DLL产物中,具体操作步骤如下:
1. 编译对应VS2015的OpenCV静态库
默认官方提供的OpenCV预编译包都是动态库版本,需要你自己通过CMake编译静态版本:
- 打开CMake选择OpenCV源码路径和构建输出路径,选择对应VS2015的编译器(32位选Visual Studio 14 2015,64位选Visual Studio 14 2015 Win64)
- 勾选
BUILD_SHARED_LIBS选项为OFF,关闭动态库编译,输出静态.lib文件 - 选择和你的项目匹配的运行库版本(/MD对应动态运行库、/MT对应静态运行库),编译完成后得到包含include头文件和静态lib的输出包
2. 配置你的VS2015项目属性
切换到和OpenCV静态库匹配的编译平台(x86/x64、Debug/Release)后做如下配置:
- C/C++ > 常规 > 附加包含目录:添加静态OpenCV输出包的
include目录路径 - C/C++ > 代码生成 > 运行库:和编译OpenCV时选择的运行库完全保持一致,Debug版对应
/MDd或/MTd,Release版对应/MD或/MT,避免运行时符号冲突 - 链接器 > 常规 > 附加库目录:添加静态OpenCV输出包的
lib目录路径(通常为install/x64/vc14/lib格式,vc14对应VS2015版本) - 链接器 > 输入 > 附加依赖项:添加你用到的所有OpenCV静态lib文件,Debug版添加带
d后缀的版本(例如opencv_core470d.lib、opencv_imgproc470d.lib),Release版添加不带d的版本;同时要把OpenCV编译生成的第三方依赖lib(例如zlib、libjpeg、libpng对应的静态lib)也一并添加,避免链接报错
3. 修正DLL导出定义
你当前的宏定义仅适用于外部调用DLL的场景,编译DLL时需要改为导出标识,修改为条件编译即可:
// 编译当前DLL时会预定义OCR_DLL_EXPORTS宏,外部调用时不定义该宏自动切换为导入 #ifdef OCR_DLL_EXPORTS #define dll_API __declspec(dllexport) #else #define dll_API __declspec(dllimport) #endif class dll_API ocr { public: recognize(frame, int, int, ...); blur(frame, int, int, ..); };
修改完成后,在项目属性 > C/C++ > 预处理器 > 预处理器定义中添加OCR_DLL_EXPORTS宏即可。
4. 编译验证
完成上述配置后重新编译项目,输出的DLL已经包含了所有用到的OpenCV代码,无需附带任何OpenCV相关的DLL,可直接交付给未安装OpenCV环境的用户使用。
常见问题排查
- 若出现LNK2005符号重复错误:检查OpenCV静态库和你的项目的运行库版本是否一致,是否同时引用了动态和静态版本的OpenCV库
- 若出现LNK2019无法解析的外部符号:检查是否漏加了对应OpenCV模块的静态lib,或者OpenCV的第三方依赖lib是否全部添加
内容的提问来源于stack exchange,提问作者user16239230
相关产品推荐
相关产品推荐

