如果我们建立一个项目Project1,它的默认属性“常规“栏中,“输出目录”为$(SolutionDir)$(Configuration)
, 在上一节宏中我们知道,
$(Configuration)
的值为Debug,所以调试时会在解决方案文件夹下建立一个Debug文件夹,并在此文件夹下生成 Project1.ilk链接器,Project1.exe文件以及Project1.pdb。默认“中间目录”为$(Configuration)
,所以会在Project1项目文件夹下(即Project1.vcxproj的项目配置文件所在位置)建立一个Debug文件夹,并在该文件夹下生成test.obj二进制文件。
默认“链接器”栏目下的“常规”选项下的“输出文件”选项为$(OutDir)$(TargetName)$(TargetExt)
,其中$(OutDir)
就已经在“常规”栏目的“输出目录”选项赋值了。【所以$(OutDir)
的值是在“输出目录”属性中定义的】。 另外,经过实际测试,发现“输出目录”属性只能起到对
$(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),此时调试器就可以正常调试通过。
“链接器”栏目下的“输入”选项下的“附加依赖项”项。此项是设置程序链接时使用的静态库。相当于链接已经编译好了的“代码”。由此我们可以简单的认为这些库就相当于我们自己写的.cpp文件,只不过这些库是编译好了的.cpp而已(这里只需要库名称即可,搜索路径在其他地方设置)。 “附加依赖性的设置”等同于在代码中写“#pragma comment(lib, “库名称.lib”) ”语句,如果使用相对路径则如下: #pragma comment(lib,"…\debug\TestLib.lib");其中的反斜杠要用双反斜杠,因为它是程序解释的双引号包括的字符串,需要转义一下,要区别include,#include "…\TestVideoApplication.h"中并不是由程序解释的字符串,所以不用转义。
1.项目设置中常用的宏:
名称解释Configuration配置名称,通常为DebugIntDir编译器使用的中间目录,生成obj文件OutDir链接器使用的输出目录ProjectDir项目目录ProjectName项目名称SolutionDir解决方案目录TargetDir目标输出文件所在的目录TargetExt目标输出的扩展名TargetFileName目标输出文件名,包括扩展名TargetName目标输出名,不包括扩展名TargetPath目标输出文件的全路径名关于路径宏的定义以及如何查看可以参考文章: https://blog.csdn.net/didi_ya/article/details/112398506
2.VS中添加的所有路径都是相对路径。
如:在“常规”–>“附加包含目录”中添加的目录: $ASTRA_HOME\include
它表示的是相对是相对于.vcxproj工程文件所在的目录。 而该文件的位置我放在了与.vcxproj同文件夹下,如图: 记住一句话:相对路径是相对于你的工程的.vcxproj的路径!!!
完!
下一篇文章:初识C++与Visual Studio(7)——Visual Studio2017头文件的路径问题(本专栏完结)