一、前言

环境变量可以用来组织 VS 工程目录。VS 作为一个 IDE,其天职在于帮开发者组织好工程,主要包括对工程中源文件、库文件的组织。(本质上是提供一个可视化的操作界面,让开发者方便的定义编译器和链接器的参数)在使用 VS 来组织工程目录时候最常用到的两个目录是:

  • 项目 -> 属性 -> 配置属性 -> C/C++ -> 常规 -> 附加包含目录
  • 项目 -> 属性 -> 配置属性 -> 链接器 -> 输入 -> 附加依赖项

VS 中默认的头文件搜索路径是工程路径 ,即 .vcxproj 文件所在路径。比如如下的目录结构:

–Root/
—-Test.vcxproj
—-hello.cpp
—-hello.h
—-world.cpp
—-world.h
—-main.cpp
—-/subdir
——sub.h

在 Root 目录包含了 .vcxproj 文件,所以 Root 就是工程路径,在 VS 中,这个目录下面的 .h 文件可以直接使用 include 包含进来, 比如在 main.cpp 中我可以写:

#include "hello.h"
#include "world.h"

但是对于 sub.h,我们就不能直接写#include "sub.h", 因为工程路径下面不能搜索到这个文件,我要告诉编译器这个文件在哪里,通常有以下两种方法:

  • 写成#include "subdir/sub.h"
  • 把 subdir 目录加入到头文件搜索路径

Google 的 C++ 编程风格鼓励第一种做法,好处是可以看到文件相对完整的路径,如果头文件搜索路径只有一个根目录,那么这个路径就是文件的相对于根目录的物理路径,方便定位文件。

如果你觉得这样写很麻烦,并且路径深度可能有多层,不同深度的路径下又通常包含大量的文件,那么就可以选择第二种做法,把每个子目录统统加入到搜索路径中,这样,就可以不用带着路径,直接#include "filename.h"就可以了。

二、如何添加文件包含目录?

具体在 VS 中要怎么合理的添加文件包含目录呢?由此,便引出了本节问题的答案:环境变量对于 VS 有什么用?用途之一就是用来编写头文件的搜索路径。

具体如下图所示:

点击编辑之后,弹出如下图所示的编辑窗口:

点击新建按钮或者双击列表空白处即可添加一条包含路径,在编辑新添加的路径时,可以看到列表条目右侧有一个浏览按钮,点击按钮可以从打开文件对话框里选择路径,点击确定后,会看到新添加的路径名。虽然通过浏览来定位文件夹比较容易,免去了自己编写,但是你会发现,通过浏览添加的路径是绝对路径。

如果你是项目的唯一开发者,并且仅仅使用这一台电脑来开发的话,那么使用绝对路径也没什么大问题。但是如果这个项目是个团队协作项目,或者你需要在好几台电脑之间切换,那么使用绝对路径就不够灵活了,如果别人的路径配置或别的电脑的路径配置不同,那么要重新修改包含路径。

一个比较合理的编写包含路径的方法是: 使用相对路径。相对谁呢?相对项目根目录或者解决方案根目录。为什么呢?因为不管别人的电脑有什么盘符、不管别人的项目放在何处,要包含的文件都可以通过项目所在位置来计算出来。当然前提是,项目开发者们事先约定好被包含文件相对于项目根目录的位置。通常是放在项目根目录(或者解决方案根目录)的某个子目录里。

三、使用环境变量的示例

使用环境变量来编写文件包含路径的好处是: 包含路径独立于工程所在的路径,无论工程被移动到哪里,都不需要重新修改包含路径,因为使用环境变量来编写的文件包含路径是一种相对路径。下面介绍一个环境变量使用的小例子。

–Root/
—-Test.vcxproj
—-hello.cpp
—-hello.h
—-world.cpp
—-world.h
—-main.cpp
—-/subdir
——sub.h

注意到 .vcxproj 所在目录即项目根目录,也就是 $(ProjectDir) 的取值等于 Root/。所以要把 subdir 放在包含目录里,可以新建这样一条包含路径:$(ProjectDir)subdir

这样,在 main.cpp 里就可以直接写#include "sub.h"了。不管项目被拷贝到哪里,都不用修改包含路径。

四、VS 常用环境变量

下面的表格给出了 VS 常用的环境变量的含义:

环境变量名 含义
$(SolutionDir) 解决方案目录:即 .sln 文件所在路径
$(ProjectDir) 项目根目录:即 .vcxproj 文件所在路径
$(Configuration) 当前的编译配置名称,比如 Debug,或 Release
$(ProjectName) 当前项目名称
$(SolutionName) 解决方案名称
$(OutDir) 项目输出文件目录
$(TargetDir) 项目输出文件目录

另外在 windows 开发过程中,难免要使用到第三方库,比如 boost,Qt,FFmpeg 等等,如果每个项目都分别去设置的话,很麻烦而且容易导致混乱,所以,通过设置环境变量 PATH,INCLUDE,LIB,LIBPATH, QTDIR 等,可以很方便地设置。

注意:

1.对于相同的值,比如用户变量和系统变量都有一个 INCLUDE,则用户变量会覆盖系统变量,导致系统变量的路径搜不到,这个需要注意。

2.还有一个问题,比如,不同项目使用的库是不同版本的,如果写在同一个变量里面会被覆盖掉,则可以为每个版本分别设置一个环境变量。

3.新添加的环境变量,如果不重启 VS 是不会生效的。

参考:

VS_ 系统环境变量设置

环境变量对于 VS 有什么用?的更多相关文章

  1. linux centos中添加删除修改环境变量,设置java环境变量

    前言 安装完软件必要添加环境变量.指令很少,然而长时间不写就会不自信:我写的对吗?于是百度开始,于是发现又是各有千秋.好吧,好记星不如烂笔头.当然,最重要的是,百度出来的都他妈的是如何添加环境变量,只 ...

  2. JAVA环境变量和TomCat服务器配置

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...

  3. 在Linux虚拟机下配置jdk的环境变量

    1.到Oracle公司的官网里下载好jdk,网址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  4. Linux环境变量设置

    修改环境变量PATH 最近为root添加一个环境变量发现sudo su进去没有变化所以总结了一下所有设置环境变量的方法: 查看PATH:echo $PATH 直接在命令行修改,就可以使用,但是只有在当 ...

  5. 再次思考 classpath 环境变量 等

    f:\aspectj1.8\lib\aspectjrt.jar;.;%JAVA_HOME%\lib;C:\Temp\IBM\SQLLIB\java\db2java.zip;C:\Temp\IBM\SQ ...

  6. Java环境变量-Linux环境

    环境变量说明 JAVA_HOME 它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk. PATH 作用是指定命令搜 ...

  7. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  8. JDK环境变量配置说明

    摘要:被人问到,为什么要配置Path/ClassPath JAVA_HOME,突然感觉有些讲不清楚."新人有资格问一个怪问题,但是老鸟不能给一个烂回答".所以今天为了让自己进一步学 ...

  9. Linux系统修改PATH环境变量方法

    在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就 ...

  10. 设置JDK环境变量(linux版)

     设置环境变量一.修改/etc/profile文件当本机仅仅作为开发使用时推荐使用这种方法,因为此种配置时所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题.用文本编辑器打开/et ...

随机推荐

  1. 使用rsync基于ssh免密登陆进行备份或目录同步

    日常工作中有很多的备份工作,rsync是一个很不错的工具,尝试使用基于ssh免密登陆的方式进行备份,测试成功,是可行且方便的方法,撰文记之,以备后用: 1.A主机root用户对B主机root用户做ss ...

  2. python之面向对象设计、编程

    面向对象 一.编程三个范式 1.面向过程编程 2.函数式编程 数学层面的函数 python中的函数编程 3.面向对象编程 二.面向对象设计 1.类:把一类事物共同的特征和共同的动作整合在一起就是类: ...

  3. webUploader的使用

    webUploader的使用记录 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML ...

  4. 数据库相关知识积累(sqlserver、oracle、mysql)

    数据库相关知识积累(sqlserver.oracle.mysql) 1. sqlserver :断开所有连接: (还原数据库) 1.数据库  分离 2. USE master GO ALTER DAT ...

  5. sed命令:删除匹配行和替换

    删除以a开头的行 sed -i '/^a.*/d' tmp.txt -i 表示操作在源文件上生效.否则操作内存中数据,并不写入文件中.在分号内的/d表示删除匹配的行 替换匹配行: sed -i 's/ ...

  6. 实现拖拽列表-微信小程序

    之前在网上搜索拖拽列表的实现时,发现了有好多的方法都是基于像素位置的计算实现的,这种方法要求列表元素的大小以及列表的位置有着非常严格的要求,修改和拓展起来非常的麻烦.于是我自己动手实现了一个基于页面元 ...

  7. mysql 优化之 is null ,is not null 索引使用测试

    关于mysql优化部分,有很多网友说尽量避免使用is null, is not null,select * 等,会导致索引失效,性能降低?那是否一定收到影响呢?真的就不会使用索引了吗? 本文的测试数据 ...

  8. 同步IDEA系列软件的设置,再也不用但心我的配置丢失了

    同步IDEA系列软件的设置 问题描述:重装idea,之前配置好的快捷键就没有了.之前一直是每隔几个月要把配置导出一下,上传百度云盘.现在好了,通过配置可以自动同步配置了.我再也不用但心配置丢失了. 快 ...

  9. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之七 || API项目整体搭建 6.2 轻量级ORM

    本文梯子 本文3.0版本文章 前言 零.今天完成的蓝色部分 0.创建实体模型与数据库 1.实体模型 2.创建数据库 一.在 IRepository 层设计接口 二.在 Repository 层实现相应 ...

  10. String substring(int start,int end)截取当前字符串中指定范围内的字符串

    package seday01;/** * String substring(int start,int end) * 截取当前字符串中指定范围内的字符串. * java api有一个特点:通常用两个 ...