logo资料库

VS2013+OpenCV 2.4.9项目生成EXE文件如何在其他电脑上直接运行.pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
如何将 VC++程序纯净打包 —— VS2013+OpenCV 2.4.9 项目生成 EXE 文件如何在其他电脑上直接运行 最近用 VS2013+OpenCV2.4.9 完成了一个项目 C++(&MFC)的。(我的是 32 位的, 所以前后一致,全部选择都是 32 位的,当然也可以是 64 位的,前后要一致) 项目做完之后,我想能不能做成可执行文件,在其他没有安装 VS 和 OpenCV 的机子上直 接运行? 注意:静态链接和动态链接的设置。 1、静态链接 多线程调试(/MTd)为 Debug 版本! 多线程(/MT)为 Release 版本! 2、动态链接 多线程调试 DLL(/MDd)为 Debug 版本! 多线程 DLL(/MD)为 Release 版本! 静态链接:不必在代码生成的.exe 文件中添加与 VS 和 OpenCV 相关的动态库.dll ,也就是说, 即使其它的电脑上什么软件也没有安装,打包好的程序也可以直接运行。 动态链接:需要添加与 VS 和 OpenCV 相关的动态库.dll ,当其它电脑上没有安装 VS 和 OpenCV 时,不添加.dll 文件是不能正常运行的。 一、配置版 准备材料 :VS2013+OpenCV 2.4.9 下面的路径都是我自己电脑的路径,需要自己调整。 (1)安装软件。安装 VS2013。将下载的 OpenCV 解压到 E:\professional\opencvazb (2)配置环境变量。计算机>属性>高级系统设置>环境变量>新建,新建一个用户变量,如 变量名:Path,变量值:E:\professional\opencvazb\opencv\build\x86\vc12\bin (3)接下来就是我们正式的工作内容了(没有使用 MFC 的可以忽略) 打开 VS2010,文件-》新建-》项目-》MFC 应用程序,建立 Test 项目。点击确定,进 入 MFC 应用程序向导,点击下一步,勾选“基于对话框”“在静态库中使用 MFC”,取消“使 用 Unicode 库 ”。点击完成。
(4)右键 Test,打开属性。 Debug 模式下: VC++目录->包含目录,编辑,加入 E:\professional\opencvazb\opencv\build\include E:\professional\opencvazb\opencv\build\include\opencv E:\professional\opencvazb\opencv\build\include\opencv2 VC++目录->库目录,编辑,加入: E:\professional\opencvazb\opencv\build\x86\vc12\staticlib(这个很重要) C/C++->代码生成->运行库,改成“多线程调试(/MTd)” 链接器->输入->附加依赖项,编辑加入下列项: vfw32.lib comctl32.lib (这两个文件 Release 和 Debug 版本是一样的) zlibd.lib libjasperd.lib libjpegd.lib libpngd.lib libtiffd.lib
IlmImfd.lib opencv_calib3d249d.lib opencv_contrib249d.lib opencv_features2d249d.lib opencv_core249d.lib opencv_flann249d.lib opencv_gpu249d.lib opencv_highgui249d.lib opencv_imgproc249d.lib opencv_legacy249d.lib opencv_ml249d.lib opencv_nonfree249d.lib opencv_objdetect249d.lib opencv_ocl249d.lib opencv_photo249d.lib opencv_stitching249d.lib opencv_superres249d.lib opencv_ts249d.lib opencv_video249d.lib opencv_videostab249d.lib Release 模式下: VC++目录->包含目录,编辑,加入 E:\professional\opencvazb\opencv\build\include E:\professional\opencvazb\opencv\build\include\opencv E:\professional\opencvazb\opencv\build\include\opencv2 VC++目录->库目录,编辑,加入 E:\professional\opencvazb\opencv\build\x86\vc12\staticlib(这个很重要) C/C++->代码生成->运行库,改成“多线程(/MT)” 链接器->输入->附加依赖项,编辑加入下列项: vfw32.lib comctl32.lib(这两个文件 Release 和 Debug 版本是一样的) zlib.lib libjasper.lib libjpeg.lib libpng.lib libtiff.lib
IlmImf.lib opencv_calib3d2410.lib (注意,没有 d) opencv_contrib2410.lib opencv_features2d2410.lib opencv_core2410.lib opencv_flann2410.lib opencv_gpu2410.lib opencv_highgui2410.lib opencv_imgproc2410.lib opencv_legacy2410.lib opencv_ml2410.lib opencv_nonfree2410.lib opencv_objdetect2410.lib opencv_ocl2410.lib opencv_photo2410.lib opencv_stitching2410.lib opencv_superres2410.lib opencv_ts2410.lib opencv_video2410.lib opencv_videostab2410.lib 点击“应用”,“确定”。 (5)如果大家全部用的是 32 位,现在就结束了,但是如果是 64 位的,还需要新建 X64 平 台。需要注意一点,如果是 64 位的,只能运行在 64 位机子上。
(6) 然后就全部结束了,大家可以尝试着编写代码了。可以在项目里面找到 Debug/Release 文件夹下找到相关的.exe,拷贝出来,就可以在其他机子上运行了。 二、非配置版 一般情况下,我在使用 OpenCV 编写程序时,都会使用这种方法(考虑到它的可移植性), 因此就会出现下面的非配置版: 首先,建立控制台应用工程。 其次,将 opencv 的 lib 文件以及 opencv2 头文件拷贝到工程目录中。 lib 文件位置 ...\build\x86\vc12\lib; Opencv2 头文件位置 ...\build\include\opencv2; ...表示 opencv 安装目录。 我用的是 visual studio 2013,所以对应 vc12 结果如图所示: 程序的配置到这里就结束了,接下来开始了解如何将程序打包: 动态链接: 编写的测试代码如下: #include "stdafx.h" //添加头文件 #include "opencv2/core/core.hpp" //核心模块,一般定义 Mat 等数据类型 #include "opencv2/imgproc/imgproc.hpp" //图像处理模块,一般定义图像处理函数 #include "opencv2/highgui/highgui.hpp" //GUI 模块,一般用于图像显示 //添加 lib 文件,一般与头文件对应,定义函数的接口
#ifdef _DEBUG #pragma comment(lib,"lib/opencv_core249d") #pragma comment(lib,"lib/opencv_imgproc249d") #pragma comment(lib,"lib/opencv_highgui249d") #else #pragma comment(lib,"lib/opencv_core249") #pragma comment(lib,"lib/opencv_imgproc249") #pragma comment(lib,"lib/opencv_highgui249") #endif //头文件和 lib 文件都是程序编译时所需要的文件,而传统方法所配置环境变量中的 dll 动态 文件则是程序运行时所需要的 对于动态链接,这些.lib 文件就足够了,如果你有特殊的需求,直接添加想要的.lib 文件即 可。 注意:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的), 而不在源文件目录去查找; 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找; 所以在这里要使用引号。 静态链接: 和动态链接的主要差别就在“对于静态库的加载”! #ifdef _DEBUG //只在 Debug 模式下才会被编译 #pragma comment(lib,"staticlib/IlmImfd.lib") #pragma comment(lib,"staticlib/libjasperd.lib") #pragma comment(lib,"staticlib/libjpegd.lib") #pragma comment(lib,"staticlib/libpngd.lib") #pragma comment(lib,"staticlib/libtiffd.lib") #pragma comment(lib,"staticlib/zlibd.lib") #pragma comment(lib,"vfw32.lib") #pragma comment(lib,"comctl32.lib") #pragma comment(lib,"staticlib/opencv_core249d.lib") #pragma comment(lib,"staticlib/opencv_highgui249d.lib") #pragma comment(lib,"staticlib/opencv_imgproc249d.lib") #pragma comment(lib,"staticlib/opencv_objdetect249d.lib") #else //只在 Release 模式下才会被编译 #pragma comment(lib,"staticlib/IlmImf.lib") #pragma comment(lib,"staticlib/libjasper.lib") #pragma comment(lib,"staticlib/libjpeg.lib") #pragma comment(lib,"staticlib/libpng.lib") #pragma comment(lib,"staticlib/libtiff.lib") #pragma comment(lib,"staticlib/zlib.lib") #pragma comment(lib,"vfw32.lib") #pragma comment(lib,"comctl32.lib") #pragma comment(lib,"staticlib/opencv_core249.lib") #pragma comment(lib,"staticlib/opencv_highgui249.lib")
#pragma comment(lib,"staticlib/opencv_imgproc249.lib") #pragma comment(lib,"staticlib/opencv_objdetect249.lib") #endif 然后就全部结束了,大家可以尝试着编写代码了。可以在项目里面找到 Debug/Release 文件 夹下找到相关的.exe 应用程序,拷贝出来,就可以在其他机子上运行了。 部分过程参考自:http://www.cnblogs.com/mmzhu/p/5373678.html
分享到:
收藏