初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结

常用项目属性和系统配置变量关系:

如果我们建立一个项目Project1,它的默认属性“常规“栏中,“输出目录”为$(SolutionDir)$(Configuration)
初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结_第1张图片
在上一节宏中我们知道,$(Configuration)的值为Debug,所以调试时会在解决方案文件夹下建立一个Debug文件夹,并在此文件夹下生成 Project1.ilk链接器,Project1.exe文件以及Project1.pdb。默认“中间目录”为$(Configuration),所以会在Project1项目文件夹下(即Project1.vcxproj的项目配置文件所在位置)建立一个Debug文件夹,并在该文件夹下生成test.obj二进制文件。
初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结_第2张图片

默认“链接器”栏目下的“常规”选项下的“输出文件”选项为$(OutDir)$(TargetName)$(TargetExt),其中$(OutDir)就已经在“常规”栏目的“输出目录”选项赋值了。【所以$(OutDir)的值是在“输出目录”属性中定义的】。
初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结_第3张图片
另外,经过实际测试,发现“输出目录”属性只能起到对$(OutDir)系统变量赋值的作用,和“改变生成的.exe文件存放位置”没任何关系。也就是说,如果“输出目录”中设置的$(OutDir)值在C盘,而“输出文件”中设置输出文件的位置为D盘,最终生成的exe文件会在D盘,“输出文件”属性才决定输出exe文件的位置。

$(TargetDir)的值是在生成.exe文件后自动赋予值为.exe文件所在位置。所以可以说,“输出文件”最终决定.exe文件所在的位置,也最终决定了$(TargetDir)的值,$(TargetExt)$(TargetDir)的行为是类似的,此不赘述。

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

另外,上面两段话可以总结出,当调试程序时,系统变量$(OutDir)的值是最先确定的,而$(TargetDir)$(TargetExt)的值是在.exe文件生成后才确定的。也就是说系统变量$(OutDir)的值由VS项目的“输出目录”属性决定,而$(TargetDir)$(TargetExt)的值由VS项目的“输出文件”属性决定。即设置了VS的“输出目录”属性就相当于设置了$(OutDir)的值,“输出目录”是界面上的提示用于接收用户输入的配置信息,然后把这个具体的配置信息存入系统内容的变量$(OutDir)中。

其它常用的属性还有,“调试”栏目中的“工作目录”项,工作目录就是程序运行过程中默认读取的目录。

“调试”栏目中的“命令”属性项,【这个属性表示调试器要启动的exe文件的全名】,包括路径名,默认为$(TargetPath),而TargetPath就表示目标输出文件的全路径名,所以一般情况下它代表的值就等于“输出文件”属性代表的值。当然你也可以人为的更改“命令”属性的值,比如更改为c:\aa.exe,而“输出文件”的值为c:\bb.exe,此时如果输出文件所在目录没有aa.exe的话(因链接器只生成bb.exe而根本不会生成aa.exe),调试器就不能启动aa.exe,提示找不到aa.exe。当然如果目录中已经有aa.exe文件(可以强制赋值一个bb.exe文件的副本并命名为aa.exe),此时调试器就可以正常调试通过。
初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结_第4张图片

“链接器”栏目下的“输入”选项下的“附加依赖项”项。此项是设置程序链接时使用的静态库。相当于链接已经编译好了的“代码”。由此我们可以简单的认为这些库就相当于我们自己写的.cpp文件,只不过这些库是编译好了的.cpp而已(这里只需要库名称即可,搜索路径在其他地方设置)。
初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结_第5张图片
“附加依赖性的设置”等同于在代码中写“#pragma comment(lib, “库名称.lib”) ”语句,如果使用相对路径则如下:
#pragma comment(lib,"…\debug\TestLib.lib");其中的反斜杠要用双反斜杠,因为它是程序解释的双引号包括的字符串,需要转义一下,要区别include,#include "…\TestVideoApplication.h"中并不是由程序解释的字符串,所以不用转义。

总结

1.项目设置中常用的宏:

名称 解释
Configuration 配置名称,通常为Debug
IntDir 编译器使用的中间目录,生成obj文件
OutDir 链接器使用的输出目录
ProjectDir 项目目录
ProjectName 项目名称
SolutionDir 解决方案目录
TargetDir 目标输出文件所在的目录
TargetExt 目标输出的扩展名
TargetFileName 目标输出文件名,包括扩展名
TargetName 目标输出名,不包括扩展名
TargetPath 目标输出文件的全路径名

关于路径宏的定义以及如何查看可以参考文章:
https://blog.csdn.net/didi_ya/article/details/112398506

2.VS中添加的所有路径都是相对路径。

如:在“常规”–>“附加包含目录”中添加的目录:
$ASTRA_HOME\include
初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结_第6张图片

它表示的是相对是相对于.vcxproj工程文件所在的目录。
而该文件的位置我放在了与.vcxproj同文件夹下,如图:
初识C++与Visual Studio(6)——Visual Studio项目属性的配置项常见问题及总结_第7张图片
记住一句话:相对路径是相对于你的工程的.vcxproj的路径!!!

完!

下一篇文章:初识C++与Visual Studio(7)——Visual Studio2017头文件的路径问题(本专栏完结)

你可能感兴趣的