如何让OpenCV工程在没有VS和OpenCV的电脑上运行

如题所述

一、如何让OpenCV工程在没有VS和OpenCV的电脑上运行?
对于这个问题,有两个方法:
1. 使用动态库,讲工程所需的.lib,.dll,.h等和工程.exe一起拷到另一台电脑上运行。
2.使用静态库,讲工程需要的.lib直接编译进.exe中,这时的.exe会比方法1中的大很多,但是此时只需要拷贝一个.exe就可以在另一台电脑上运行了。

二、如何将.lib编译进.exe中?
注意这里的.lib是静态链接库,与动态链接库的引导库.lib不同(动态链接库.dll需要有一个.lib作为引导库)。
将.lib编译进.exe中的第一步是编译OpenCV的静态库.lib。具体的编译方法可以参考:OpenCV - 编译静态OpenCV库(静态库)
生成OpenCV的静态库后,就可以进行第二步了。
1,将相应的静态库配置到工程中。
2,配置属性-〉MFC的使用:设置为 在静态库中使用 MFC
3,配置属性-〉C/C++ -〉代码生成-〉运行库 :设置为 多线程 (/MT)。
在VC(2005以上)中有四种运行库:Multi-threaded(/MT)、Multi-threaded-Debug(/MTD)、Multi- threaded-dll(/MD)、Multi-threaded-debug-dll(/MDD):前两个是静态类型库,提供的函数会被链接到程序中;后两个是动态库,会以动态链接库的形式提供函数给程序调用。
设置完之后,生成的.exe就可以直接使用了。
该部分可参考:OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住

三、补充
1, 其实在安装和编译OpenCV后,其本身已经包含了静态库,在 \build\x86\vc10\staticlib 和\build\x64\vc10\staticlib 路径下,所以本文的使用CMake 编译静态库可以省略掉。
2。按照 二 中的步骤生成.exe运行,发现读取视频不成功。原因是OpenCV的视频解码等处理是基于ffmpeg,而OpenCV仅仅提供了ffmpeg的动态链接库 opencv_ffmpeg***.dll,并没有其静态链接库,即使是使用CMake也不能生成(勾选WITH_FFMPEG也不行)。
所以如果想让视频读取成功,该.exe需要一个.dll支持,即opencv_ffmpeg***.dll。
3。编译ffmpeg静态库的方法可以参考:MinGW下编译ffmpeg静态库给Visual C++使用
按照该方法可以编译出一堆.a文件,即ffmpeg的静态库。这些.a文件的调用具有一定的顺序。
但是我按照文中方法设置后依然无法打开视频。
同时我注意到,OpenCV中也有类似的文件,存放于 \opencv\3rdparty\include\ffmpeg_ 及opencv\3rdparty\lib 中,料想就是ffmpeg的静态库,但是设置后依然无法打开视频。
所以,万不得已,最后的方法还是加入一个.dll支持,即opencv_ffmpeg***.dll。
4。针对文章:OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 中提到的videoInput.lib,我始终都没有找到,料想是版本的不同吧。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-07-31
程序中用到opencv的那些库文件,就得包含相应的dll文件。比如,程序中包括opencv_core231.lib,那就得把opencv_core231.dll文件打包到exe文件目录下。或许,还得加进去编译opencv的编译器的相应库,例如,opencv使用vs2008编译的,需要添加vs2008安装目录\VC\redist\x86\Microsoft.VC90.CRT 下的三个dll文件,这样在没有装过vs2008的电脑上,也可以运行程序。
第2个回答  2017-07-31
为工程的编译编译选项(Project->Settings...->C/C++)增加/Zm200,作用是增加堆栈... 编译出来的程序也可以脱离OpenCV的动态链接库运行了
第3个回答  2017-07-31
输出独立环境运行的exe
相似回答