opencv2413+VS2013静态编译
2017-11-10 14:08
267 查看
http://xinghao.me/2015/07/14/2015-07-14-opencv-static-compile/
静态编译vs.动态编译
程序中需要用到第三方库时,要使得程序在别的电脑上也能正常运行,通常有两种方式:动态编译。即在程序运行时动态加载第三方库,这时候就需要把涉及到的第三方库的dll和exe文件放在同一目录下。优点是exe文件比较精简,而且如果第三方库有更新,替换掉相应dll文件即可,可维护性和升级性强。缺点是exe运行时需要附带很多dll文件,比较麻烦,而且有潜在的由于dll版本不一样带来的兼容性问题。
静态编译。即在程序编译生成时,把第三方库的代码嵌入到要生成的exe文件中,这样单个exe文件就能在其他电脑上运行。优点是单个exe文件即可执行,直观简洁。缺点是exe文件较大,而且第三方库更新时需要重新编译。
vs2013静态编译设置
要想在visual studio中静态编译程序,需要有两处地方进行设置。项目->属性->配置属性->C/C++->代码生成->运行库
运行库下面有四个下拉选项,选项及含义见下表:
选项 | 含义 |
---|---|
多线程(/MT) | Release下的静态编译 |
多线程调试(/MTd) | Debug下的静态编译 |
多线程DLL(/MD) | Release下的动态编译 |
多线程调试(/MDd) | Debug下的动态编译 |
项目->属性->配置属性->常规->项目默认值->MFC的使用
其默认值为使用标准Windows库,将其改成在静态库中使用MFC即可
OpenCV静态编译
设置静态库目录
接下来是设置OpenCV的静态编译了。现在的OpenCV直接带有静态编译的链接库版本,无需自己重新编译,在%opencv_dir%/build/x86/vc10/staticlib目录下。项目->属性->配置属性->VC++目录->库目录
把上面的静态库目录添加进去即可。
设置附加依赖项
项目->属性->配置属性->连接器->输入->附加依赖项,进行设置即可。
OpenCV相关依赖项
在OpenCV中staticlib目录中的lib文件和lib目录中的文件命名方式是一样的,把程序中用到的库文件添加进去,比如:1 | opencv_calib3d2413d.lib opencv_contrib2413d.lib opencv_core2413d.lib opencv_features2d2413d.lib opencv_flann2413d.lib opencv_gpu2413d.lib opencv_highgui2413d.lib opencv_imgproc2413d.lib opencv_legacy2413d.lib opencv_ml2413d.lib opencv_nonfree2413d.lib opencv_objdetect2413d.lib opencv_photo2413d.lib opencv_stitching2413d.lib opencv_ts2413d.lib opencv_video2413d.lib opencv_videostab2413d.lib |
1 | IlmImfd.lib libjasperd.lib libjpegd.lib libpngd.lib libtiffd.lib zlibd.lib |
系统相关
设置好OpenCV相关的依赖项之后,如果此时编译,则会出现很多类似于下一句的错误:1 | 1>opencv_highgui247d.lib(window_w32.obj) : error LNK2019: 无法解析的外部符号 __imp__GetSystemMetrics@4,该符号在函数 _xGetSystemMetrics@4 中被引用 |
如果注意观察的话,可以发现,在动态编译时,附加依赖项设置页面下方有“继承的值”一项(从父级或项目默认设置继承)。而改成
静态编译之后,这些默认值没有了,所以需要手动添加。
1 | kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib |
1 | 1>opencv_highgui2413d.lib(window_w32.obj) : error LNK2019: 无法解析的外部符号 __imp__CreateToolbarEx@52,该符号在函数 "int __cdecl icvCreateTrackbar(char const *,char const *,int *,int,void (__cdecl*)(int),void (__cdecl*)(int,void *),void *)" (?icvCreateTrackbar@@YAHPBD0PAHHP6AXH@ZP6AXHPAX@Z3@Z) 中被引用 |
1 | comctl32.lib |
相关文章推荐
- VS2013中编译项目在静态库中使用MFC出现错误的解决方法
- vs2013 静态编译Qt和配置方法
- OpenCV3.0 + VS2013配置三:编译和调试OpenCV源码
- VS2013编译Qt5.6.0静态库
- VS2013+opencv3.3的安装(或自行编译源码)及配置
- Qt学习(六) VS2013编译Qt5.3.1的静态库
- Windows平台下OpenCV3源码编译(VS2013)
- VS2013 编译 OpenCV_CUDA 工程编译出错
- Cmake + VS2013编译opencv
- VS2013+OpenCV3.4.2编译
- 编译cuda版本的opencv——cuda7.5+opencv2.4.9+vs2013
- VS2013下编译opencv3.1.0及其对应contrib库
- (原)vs2013静态及动态链接opencv3.0的库
- Windows下利用CMake和VS2013编译OpenCV
- 【OpenCV3】OpenCV3.2.0在VS2013环境下Cmake编译与快速配置
- Windows下利用CMake和VS2013编译OpenCV
- 在VS2013下编译openCV(最新适用)
- 编译opencv2.4.9+cuda6.5+vs2013生成自己的X64库
- Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013
- Windows下利用CMake和VS2013编译OpenCV