如何将 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