VS工程目录结构 + OpenCV环境配置 的最优解决方案

时间:2024-04-03 16:20:56

一、本文简介

最近在OpenCV群里面很多人在编译别人的一些工程的时候,总是不是这有问题就是那里有问题,不是找不到lib,就是缺失dll,其实这都是一个原因导致的,那就是OpenCV环境配置不正确或者说不合理。然后我就想了一下为何很多人会遇到这样的问题,回忆了一下自己第一次配置OpenCV环境的历程,想想都是网上配置OpenCV环境存在问题或者不合理性。一般网上的教程都是配置默认属性页、配置环境变量等,其实这种方式虽然对于自己很方便,但是对于项目移植非常不利,为了让更多的人合理的配置OpenCV环境,故写下这篇博客。本博客主要分为两部分内容:
1.新建合理的VS2015工程目录结构
2.配置合理的OpenCV环境

二、新建合理的VS2015工程目录结构

1.合理目录结构概览

我的目录结构如下图所示:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
主要有C++Sln、include、lib、dll、sys、Bin、dll、Intermediate、pdb8个文件夹他们的作用分别如下:
①C++Sln文件夹:用来存放.sln解决方案和工程文件源码的;
②include文件夹:用来存放第三方库.h头文件或者自己导出库的.h头文件;
③lib文件夹:用来存放第三方库.lib文件或者自己导出库的.lib文件;
④dll文件夹:用来存放第三方库.dll文件或者自己导出库的.dll文件;
⑤sys文件夹:用来存放一些资源文件:比如说图片、xml文件等;
⑥Bin文件夹:用来存放编译生成的.exe文件和对应的pdb文件;
⑦Intermediate文件夹:用来存放编译生成的一些中间文件,如.obj文件;
⑧pdb文件夹:用来存放编译生成的库(.lib或.dll)对应的.pdb文件;
下面分节详细说明这几个文件夹的具体细节,并如何用VS2015一步步生成。

2.C++sln文件夹

这个文件夹的名字不一定非得是这个,依据你的解决方案名称进行修改。这个文件夹下的目录结构如下图:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
其中C++sln.sln就是解决方案文件,其他的所有文件夹里面存放的都是解决方案下的工程文件及相应源码,如,readAndWriteTxtFile文件夹的目录如下:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

首先在硬盘某一处新建一个文件夹CPlusPlusStudy,用来存放上面总说的8个文件夹。然后,打开vs2015新建工程页面,如下图所示,新建一个空的解决方案,命名为C++sln.sln。location处为刚刚新建的CPlusPlusStudy文件夹位置,Name处填写解决方案名字。最终生成如图的解决方案。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
新建完解决方案后,可以向解决方案中添加工程,在Solution上右键添加新建名为readAndWriteTxtFile的工程,并添加readAndWriteTxtFile.cpp源文件如下图所示。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
最终就生成了C++sln文件夹,及其工程子目录。

3.include文件夹

这个文件夹的名字一般也就固定为include了,需要自己手动新建。这个文件夹的目录结构如下图所示:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
其中IJZDllLoaderInterface.h和IJZOpenCVUtilsInterface.h就是自己导出库的.h头文件,OpenCV、CoreInclude、SDKBase文件夹是第三方库.h头文件。

按照2中的方法,给解决方案添加一个OpenCVTest工程,然后我们给该工程添加include头文件。右键该工程点击属性,选择VC++Directories,编辑Include Directories目录,将../../include/OpenCV添加进去。注意Configuration和Platform都选择All,如下图所示。至于相对目录的说明见下面的补充说明。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
同样的方法也可以将include文件夹、CoreInclude文件夹、SDKBase文件夹加入include目录。

4.lib文件夹

这个文件夹的名字一般也就固定为lib了,需要自己手动新建。这个文件夹的目录结构如下图所示:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
Import_lib文件夹存放的是导入第三方库的.lib文件,包括Debug/Release、Win32/x64各个版本,如下图所示,存放的是OpenCV3.2.0的.lib文件。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

接下来我们给OpenCVTest工程添加用到第三方库的.lib文件所在的文件夹到lib目录。右键工程点击属性,选择VC++Directories,编辑Library Directories目录,将../../lib/Import_lib/OpenCV/$(Platform)/$(Configuration)添加进去,如下图所示。其中 $(Platform)和$(Configuration)表示当前的平台(Win32/x64)和配置(Debug/Release)。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

5.dll文件夹

这个文件夹的名字一般也就固定为dll了,需要自己手动新建。这个文件夹的目录结构如下图所示:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
Import_dll文件夹下存放的是导入第三方库的.dll文件,包括Debug/Release、Win32/x64各个版本,如下图所示,存放的是OpenCV3.2.0的.dll文件。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

接下来我们给OpenCVTest工程添加用到第三方库的.dll文件所在的文件夹到vs临时环境变量中去。右键工程点击属性,选择Debugging,编辑Environment目录,将path=%path%;../../dll/Import_dll/OpenCV/$(Platform)/$(Configuration)添加进去,如下图所示。其中$(Platform)和$(Configuration)表示当前的平台(Win32/x64)和配置(Debug/Release)。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

到这个文件夹为止,我们的工程应该就能编译通过了,但是你会发现,编译完成后,C++sln目录下多了一个debug文件夹,OpenCVTest文件夹下多了一个debug文件夹,这些文件夹都是存放的一些中间文件(.obj文件)或者.exe文件。一般情况下,我们希望我们的项目将这些生成的中间文件和exe文件不和源文件、lib文件、dll文件放置在一块,因为这不方便将项目共享出去,毕竟中间文件和.exe文件都比较大,所以需要将这些文件给删除掉。如果和这些文件混在一块后,一个工程手动删除还好,如果工程多了起来,手动删除就非常费时费力了。所以需要更改生成目录,于是乎需要用到下面的几个目录了。

6.sys文件夹

这个文件夹的名字一般也就固定为sys了,需要自己手动新建。这个文件夹的目录结构如下图所示:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
这个文件夹没什么好说的,主要用来存放一些资源文件。

7.Bin文件夹

这个文件夹的名字我喜欢命名为Bin,用来存放exe文件和对应的pdb文件,这个文件夹的目录结构如下图所示:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

接下来我们将exe的生成目录修改到Bin文件夹下,右键点击工程属性,选择General,编辑Output Directory目录,将../../Bin/$(Platform)/$(Configuration)添加进去,如下图所示。其中$(Platform)和$(Configuration)表示当前的平台(Win32/x64)和配置(Debug/Release)。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

8.Intermediate文件夹

这个文件夹的名字我喜欢用Intermediate命名,代表中间的意思,用来存放编译生成的一些中间文件,如.obj文件,这个文件夹的目录结构如下图所示:
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
接下来将中间文件的生成目录修改到Intermediate文件夹下,右键点击工程属性,选择General,编辑Intermediate Directory目录,将../../Intermediate/$(Platform)/$(Configuration)/$(ProjectName)添加进去,如下图所示。其中其中$(Platform)和$(Configuration)表示当前的平台(Win32/x64)和配置(Debug/Release),$(ProjectName)表示该工程的名字。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

9.pdb文件夹

这个文件夹的名字一般固定为pdb,用来存放编译生成的库(.lib或.dll)对应的.pdb文件。这个文件文件夹的目录结构如下图所示。其中JZDllLoader.pdb和JZOpenCVUtils.pdb两个文件就是我添加的两个工程生成的dll对应的pdb文件。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

右键sln点击添加新建工程JZDllLoader,右键工程点击属性,按照之前的教程配置include、lib、dll、文件夹。修改工程的General->Configuration Type改为Dynamic Library (.dll),然后编写自己的dll就行了。
然后,选择Linker->General,编辑Output File为../../dll/$(Platform)/$(Configuration)/$(TargetName)$(TargetExt),也就是将该工程生成的.dll文件自动生成到dll文件夹中,如下图。
再次,选择Linker->Advanced,编辑Import Library为../../lib/$(Platform)$(Configuration)$(TargetName).lib,也就是将该工程生成的.lib文件自动生成到lib文件夹中,如下图。
最后,选择Linker->Debugging,编辑Generate Program Database File为../../pdb/$(Platform)/$(Configuration)/$(TargetName).pdb,也就是将该工程生成的.pdb文件自动生成到pdb文件夹中,如下图。
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案
VS2015工程目录结构 + OpenCV环境配置 的最优解决方案

三、配置合理的OpenCV环境

其实,配置合理的OpenCV环境就是配置一个工程的include、lib和dll文件夹,只要这几个文件夹配置正确了,OpenCV环境也就搭建好了,具体操作就不一一重复了,参看第二部分。

四、补充说明

1.VS中的相对路径

①在.cpp中的添加包含路径是以当前.cpp文件的路径为相对起点的;
②在项目的属性页中配置相对路径是以当前项目的.vcpro为起点的(注意不是.sln,sln是当前解决方案的路径,一个解决方案可能包含很多个项目)。

2.项目地址

https://git.oschina.net/PDBC/CPlusPlusStudy.git

3.有人提出来命名不要用C++sln这种形式

我的建议是:确实不要用这种命名习惯,并且以后搞开发,路径、名字等尽量不要包含一个中文字符或者其他特殊字符,尽量用全英文的形式

4.对于OpenCV库的编译参看我的另一篇博客。