环境变量与DLL等文件引用

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文件夹下,即可直接运行。

一般来说,采用方式①与方式②的比较多,通常不会使用方式③。

  

对于头文件、dlllibVS环境下的设置,全部都集中于Tools->Options->Projects and Solutions->VC++Directroies。右上角有个下拉列表,其中Executable files用于包含dll目录,Includefiles用于包含头文件目录,Library files用于包含lib文件目录。

一般来说,需要用某个库,就会对某个库进行安装,安装后的文件通常都在C:\Program Files下,该库所有运行必须的头文件、dlllib也都在这里。所以对该库配置VS时,只要将所有引用的头文件、dlllib的路径在VS中各自设定好,指向相应的安装文件所在位置即可。

 

有很多库都提供DebugRelease两种版本,相应的在安装文件处会有这两个版本各自的dlllib。注意如果需要#pragmacomment(lib,"opencv_calib3d248.lib")来调用一个lib,那么一定要把Releaselib写在Debuglib之前。因为同一个函数,在DebugRelease中的实现是基本相同的,但Debug中会多一部分调试信息。所以如果将Debuglib写在前面,那么当运行Release模式的时候,就会调用Debuglib,从而遇到调试信息出错。而在Debug模式下,即使调Releaselib也一般不会有问题,但有时候还是会出错。

所以,应该在Debug模式下调用Debuglib,在Release模式下调用Releaselib,这两者需要分清楚。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值