VS所使用的环境变量有两种:
一种是系统环境变量,在我的电脑上单击右键选属性设置;
另一种是VS环境变量,或者叫VS路径,需要在VS中选Tools->Options->Projectsand Solutions->VC++ Directorise来设置,(从VS2010开始该选项的位置已经更改到了Project->XX工程属性->Configuration Properties->VC++Directories里面,右侧即是)
其中右上角:
1) Executable files:是设置dll文件目录;
2) Invlude files:是设置.h文件目录;
3) Library files:是设置lib文件目录;
4) Source files:是设置源文件目录,包括.h与.cpp
该目录主要是为了提供智能的自动补全与提取定义和注释等功能。所有VS工程都共享VS的该环境变量设置。
环境变量的作用就是指定某些文件,如.h,lib,dll等的位置。当编译器进行编译时,需要调用某些文件时,就会按照环境变量指定的路径来寻找所需文件。其寻找顺序是:
① 当前工程目录下
② VS环境变量提供的目录
③ 系统环境变量提供的目录
当然该顺序是针对于" "所引用的头文件。对于< >所引用的头文件,则直接从步骤②开始。
< >引用的是VS环境变量里面的头文件;找不到则去系统环境变量中找。
" "引用的是你程序目录的相对路径中的头文件;找不到则去VS环境变量中找;再找不到则去系统环境变量中找。
比如OpenCV,安装后,会自动将所有.h,.lib,.dll安装在C:\Program Files\OpenCV文件夹下,然后将各自的路径作为环境变量注册到系统环境变量与VS环境变量中。这样,当需要引用时,可以直接在工程中#include<opencv2\opencv.hpp>来引用。VS只要按照VS环境变量去找,即可找到所需文件。
同理,如果将OpenCV安装好的文件夹复制到一台没有安装过OpenCV的机器上,则只需要在VS环境变量与系统环境变量二者任意一个中指定OpenCV中各种文件的位置,就可以直接在工程中#include<opencv2\opencv.hpp>来引用。
但是,dll这个文件属于动态链接库,需要在执行时加载。所以当生成exe文件时,需要将所需要的dll文件复制到exe文件夹下,否则无法运行。这就是为什么很多软件安装时需要同时安装VC库,因为软件是用VS做的,里面用到了很多VS的文件,但即将安装该软件的机器上不一定有软件所需要的VS文件,所以就装一个VC库,从而使得软件可以正常运行。其实VC库主要就是dll文件。
特别注意在系统环境变量中是默认指定System32文件夹的。也就是说可以不为dll指定路径,只需要将dll放在System32文件夹下,那么当需要该dll时,系统就会自动去System32文件夹下寻找。若找到就会调用。
当然,如果在系统环境变量中或者VS的环境变量中专门指定了所需dll文件的具体位置,那么无需将dll放在System32文件夹下也可以正常编译运行。
所以,一个发布的安装包,如果需要dll文件,有三种方式:
① 将dll文件放在exe同一目录下,即可直接运行。
② 将dll文件放在一个新建的文件夹下,并将该文件夹的路径注册进系统的环境变量中,便可运行。注册系统环境变量的工作由安装包完成。
③ 将dll文件直接放在System32文件夹下,即可直接运行。
一般来说,采用方式①与方式②的比较多,通常不会使用方式③。
对于头文件、dll与lib在VS环境下的设置,全部都集中于Tools->Options->Projects and Solutions->VC++Directroies。右上角有个下拉列表,其中Executable files用于包含dll目录,Includefiles用于包含头文件目录,Library files用于包含lib文件目录。
一般来说,需要用某个库,就会对某个库进行安装,安装后的文件通常都在C:\Program Files下,该库所有运行必须的头文件、dll与lib也都在这里。所以对该库配置VS时,只要将所有引用的头文件、dll与lib的路径在VS中各自设定好,指向相应的安装文件所在位置即可。
有很多库都提供Debug与Release两种版本,相应的在安装文件处会有这两个版本各自的dll与lib。注意如果需要#pragmacomment(lib,"opencv_calib3d248.lib")来调用一个lib,那么一定要把Release的lib写在Debug的lib之前。因为同一个函数,在Debug与Release中的实现是基本相同的,但Debug中会多一部分调试信息。所以如果将Debug的lib写在前面,那么当运行Release模式的时候,就会调用Debug的lib,从而遇到调试信息出错。而在Debug模式下,即使调Release的lib也一般不会有问题,但有时候还是会出错。
所以,应该在Debug模式下调用Debug的lib,在Release模式下调用Release的lib,这两者需要分清楚。