Visual Studio中的环境变量(以Visual Studio 2013为例)

前言

本文总结了Visual Studio中常见的环境变量及其在组织解决方案、工程中的作用。

注:本文使用的是Visual Studio 2013,由于作者主要从事C/C++开发,所以是以Visual C++的工作环境配置来描述。

什么是vs的环境变量?

先看图吧,图中以美元符号$开头 + 一对括号,这样进行引用的就是我所谓的环境变量,

图中出现的几个环境变量含义如下:

环境变量名 含义
$(SolutionDir) 解决方案目录:即.sln文件所在路径
$(Configuration) 当前的编译配置名称,比如Debug,或Release
$(ProjectName) 当前项目名称,图中即为Game

在中文版的VS中,环境变量翻译为“宏”,为了避免与C/C++语言中的宏(Macro)搞混,我在本文中把它叫做“vs环境变量”,简称环境变量。

环境变量有什么用?

使用环境变量来组织工程目录

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

  • 头文件包含目录 (对应于编译器命令的:-I 参数)
  • 库文件搜索路径 (对应于编译器的:-l 参数)

vs中默认的头文件搜索路径是: 工程路径 – 即,.vcxproj(不同版本的VC++后缀名称不同,如vs2010中后缀为.vcproj) 文件所在路径。比如如下的目录结构:

–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中添加一个头文件搜索路径这个常识,在此还是为初学者唠叨一下具体做法:工程属性 - 配置属性 - C/C++ - 常规 - 编辑右侧的”附加包含目录”取值即可。

具体如下图所示:

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

在这里可以新建、删除包含路径、调整包含顺序。

点击新建按钮或者双击列表空白处即可添加一条包含路径,在编辑新添加的路径时,可以看到列表条目右侧有一个浏览按钮,

点击按钮可以从打开文件对话框里选择路径,点击确定后,会看到新添加的路径名。虽然通过浏览来定位文件夹比较容易,免去了自己编写,但是你会发现,通过浏览添加的路径是绝对路径。

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

一个比较合理的编写包含路径的方法是: 使用相对路径。

相对谁呢? 相对项目根目录或者解决方案根目录。

为什么呢?因为不管别人的电脑有什么盘符、不管别人的项目放在何处,要包含的文件都可以通过项目所在位置来计算出来。

当然前提是,项目开发者们事先约定好被包含文件相对于项目根目录的位置。通常是放在项目根目录(或者解决方案根目录)的某个子目录里。

具体怎么做呢?这就需要用到本文的主题:环境变量了。刚才提到的两个相对目录所对应的环境变量如下表所示:

目录 对应的环境变量名称
项目根目录 $(ProjectDir)
解决方案根目录 $(SolutionDir)

要解决刚才小例子中的问题,

–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) 项目输出文件目录
$(TargetName) 项目生成目标文件, 通常和$(ProjectName)同名
$(TargetExt) 项目生成文件后缀名,如.exe, .lib具体取决于工程设置
$(ProjectExt) 工程文件后缀名,如.vcxproj

在下一篇文章中,讲介绍如何合理使用这些环境变量来组织VC++工程。

进阶思考

  • 如何定义、扩展VS的环境变量?


作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!

在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问

时间: 2024-08-03 19:59:14

Visual Studio中的环境变量(以Visual Studio 2013为例)的相关文章

Visual Studio中设置环境变量

在VisualStudio2010中设置环境变量的格式如下: PATH=%PATH%;D:\PhysXSDK\Bin\vc10win64; 或者: PATH=D:\PhysXSDK\Bin\vc10win64;%PATH% 最关键的是,一定要再自己的路径后面加一个 分号;,不然设置就会失败

Asp.Net Core 如何在 IIS 中设置环境变量

当运行一个 Asp.Net Core 应用的时候, WebHostBuilder 根据环境变量来判断当前运行的是哪个环境,可能是 Development,Staging或者Production.你也可以设置成随便的一个字符串. 这个链接将会告诉你 如何在各种平台各种环境中设置环境变量.但如果你使用 IIS来代理 Asp.Net Core.你需要在 web.config 中设置环境变量 <configuration> <system.webServer> <handlers&g

关于Lumen / Laravel .env 文件中的环境变量是如何生效的

.env 文件包含默认环境变量,我们还可自定义其他任何有效的变量,并可通过  调用 env() 或 $_SERVER 或 $_ENV  来获取该变量.那么env()是如何加载到这些变量的呢?在Lumen的vendor/laravel/lumen-framework/src/helpers.php中,我们可以发现env函数是这样被定义的: if (! function_exists('env')) { /** * Gets the value of an environment variable.

001_java开发中配置环境变量的含义

在学习java的时候需要配置环境变量,但是为什么需要配置path和classpath这2个环境变量呢?    (1) 首先,搞起清楚path这个环境变量的作用.我们cmd到dos命令窗口的时候,输入ipconfig.        其实它调用的是存放在某个目录下面的ipconfig.exe程序,那么操作系统如何知道ipconfig程序存放在哪个目录下的呢?        这时候我们用set path的命令,就能看到很多目录,用;隔开.(如下所示)        #################

python 程序中设置环境变量

python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息. 2.os.popen('command'),该方法不但执行命令还返回执行后的信息对象,是通过一个管道文件将结果返回,例如可以设置一个变量,返回结果. 1 cha = os.popen('ls /').readlines 3.模块subprocess,实际使用过程中发现,假设要在代码当前进程中设置

Linux中的环境变量PATH

首先一点Linux中的每个命令其本质是一个可执行的文件,以ls命令为例.通过命令:$:whereis ls可以查看ls命令的位置在/bin/目录下.当用$:ls -l /bin/ls命令查看文件/bin/ls的属性时,得到如下结果: 其实我们在任意目录下执行的ls命令时,其实执行的是位于/bin目录下的ls文件.那么当在任意目录下执行各种命令时,是怎么找到各自的命令的呢?这就是PATH的作用.查看环境变量PATH的内容如下: PATH的作用就是,当输入命令的时候,Linux会去查找PATH里面记

Xcode 8:在 Active Compilation Conditions 中自定义环境变量

来源:没故事的卓同学 链接:http://www.jianshu.com/p/96b36360bb2d 在Xcode 7我们在 OTHER_SWIFT_FLAGS中配置环境变量.但是有一个不爽的地方就是需要在自定义的变量前增加“-D”后才能使用.比如: 然后才能正常使用: #if MYFLAG // 逻辑判断 #endif 现在在Xcode 8中新增了一个 SWIFT_ACTIVE_COMPILATION_CONDITIONS选项,现在直接在里面添加就可以啦! 在代码中的使用逻辑和之前一样. 相

java中获取环境变量

分为获取java自身的一些环境变量和和操作系统相关的环境变量. 获取JVM相关的一些变量 在运行时设置一个环境变量 debug 为 true: java -Ddebug=true YourClass在程序中设置一个环境变量 debug 为 true: System.setProperty( "debug", "true" );获取一个环境变量 debug : String debug = System.getProperty( "debug" )

java中的环境变量的配置

作为初学者来说配置环境变量是初学者的第一步: 下载并安装JDK1.60(或以上版本),假设安装在X:\jdk150目录下 打开:控制面板 系统 高级 环境变量 变量名 变量值 path .;X:\jdk140\bin ClassPath .;X:\jdk140\lib\tools.jar; .;X:\jdk140\lib\dt.jar; JAVA_HOME X:\jdk140 path 路径是为了保证在任何路径下都能找到,使用java的指令. 配置ClassPath路径是为了虚拟机能够找到我们要