环境变量对于 VS 有什么用?
一、前言
环境变量可以用来组织 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 是不会生效的。
参考:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
2018-12-16 [Qt及Qt Quick开发实战精解] 第1章 多文档编辑器
2018-12-16 Qt应用程序主窗口之一:主窗口框架