vs工程下的输出目录/输出文件/工作目录等

vs工程下的输出目录/输出文件/工作目录等

1.vs解决方案下各文件夹的包含关系

vs工程下的输出目录/输出文件/工作目录等

 一般来说,vs中的c++项目的解决方案总文件夹下包含解决方案配置文件sln和一个项目总文件夹和x64文件夹(包含一个Debug文件夹以及一个Release文件夹,存放最终生成的结果exe或dll,如果不使用Release生成,则不存在Release文件夹)共四个文件夹。
vs工程下的输出目录/输出文件/工作目录等

而解决方案和项目文件夹包含关系下包含C++源文件头文件、项目配置文件和一个Debug文件夹以及一个Release文件夹(注意,此处的Debug和Release文件夹仅仅存放中间编译结果obj,不存放exe和dll之类的东西。如果不使用Release编译,则没有对应的Release文件夹)
vs工程下的输出目录/输出文件/工作目录等

 

Debug:调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试。Debug模式下生成两个文件,除了.exe或.dll文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息

Release:发布版本,不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的。(调试信息可在单独的PDB文件中生成)。Release模式下生成一个文件.exe或.dll文件
 

2.输出目录/输出文件/工作目录

2.1 输出目录-决定$(OutDir)

即设置了VS的“输出目录”属性就相当于设置了$(OutDir)的值。

如果我们建立一个默认的vc项目VsQt,他的默认“常规“栏目中,“输出目录”为$(SolutionDir)$(ConfigurationName),所以调试时会在解决方案文件夹下建立一个debug(ConfigurationName的值为debug)文件夹,并在此文件夹下生成 VsQt.lik链接器 和VsQt.exe文件(默认情况下) 。

vs工程下的输出目录/输出文件/工作目录等

默认“中间目录”为$(ConfigurationName),所以会在VsQt项目文件夹下(即VsQt.vcproj的项目配置文件所在位置)建立一个debug文件夹,并在该文件夹下生成VsQt.obj二进制文件。

vs工程下的输出目录/输出文件/工作目录等

 默认“链接器”栏目下的“常规”选项下的“输出文件”选项为​$(OutDir)$(ProjectName).exe,其中$(OutDir)就已经在“常规”栏目的“输出目录”选项赋值了。
vs工程下的输出目录/输出文件/工作目录等

 注意:实际上输出目录不决定输出exe文件的位置。

2.2 输出文件-决定$(TargetDir)

$(TargetDir)的值是在生成exe文件后自动赋予值为exe文件所在位置。所以可以说,“输出文件”最终决定exe文件所在的位置

默认情况下“输出目录”和“输出文件”两个属性对应的目录是一样的,这样用着方便(当然,输出文件的值在输出目录的值的基础上还包含有exe文件名)。如果两个不一样,则中间生成的链接器用的如xx.ilk和xx.pdb文件等在输出目录,而最终生成的xx.exe文件在“输出文件”属性设置的目录中。

当调试程序时,系统变量$(OutDir)的值是最先确定的,而$(TargetDir)和$(TargetPath)的值是在exe文件生成后才确定的。也就是说系统变量$(OutDir)的值由VS项目的“输出目录”属性决定,而$(TargetDir)和$(TargetPath)的值由VS项目的“输出文件”属性决定。
 

2.3 工作目录

“调试”栏目中的“工作目录”项,这个属性默认情况下是$(ProjectDir),表示工作目录是工程目录,也就是工程配置文件VsQt.vcproj所在目录。

 “工作目录”属性作用是程序运行后唯一识别的默认目录,即工作后只认识这个目录。

例如程序运行过程中生成一个txt文本文件,如果在创建文件过程中未指定绝对路径,只指定创建文件的文件名,那么这个文本文件默认就会建立在工作目录中,当然读取一些配置文件也在工作目录中查找,但要说明一下,生成的exe文件跟工作目录没任何关系,也不会放在工作目录中。总的来说,工作目录就是程序运行过程中默认读取的目录。
 

重要补充:

vs中工作目录的设置是给调试用的,也即你启动调试后,启动一个新进程,自动把这个新进程的工作目录设置为vs项目属性中的工作目录,然后新进程启动对应的exe程序。

但是如果不使用vs的调试启动exe,而是直接双击exe文件启动一个新进程时,会自动把这个新进程的工作目录设置为exe文件所在的目录,这是和vs启动调试不同的地方。所以如果发布的时候不把工作目录内的东西拷到exe所在的目录内,就会运行出错,因为此时工作目录不再是vs中设置的了,而是exe文件所在的目录。


上面所说的“调试”是指vs下启动exe,包括debug模式和release模式,不要把调试就理解为只有debug模式。

如果工程中用到的文件不在默认的工作目录下,而程序中又直接使用了相对路径,则应修改工作目录。

参考:(266条消息) VS项目属性的一些配置项的总结(important)_Wait的专栏-CSDN博客

上一篇:引发的异常: 0xC0000005: 读取位置 0x0000000200000000 时发生访问冲突


下一篇:运行springboot:run报错java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy