Visual Studio项目配置的总结

写的不错,最近OGRE的项目管理各种混乱,整理一下思路

原文转自

http://blog.csdn.net/waitforfree/article/details/8622059


       VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系,假设新建一个项目ssyy,解决方案起名fangan,注意解决方案包括项目,此时生成的最外层目录为fangan代表整个解决方案的内容都在这个文件夹内。在这个fangan文件夹内包含有fangan.sln的解决方案配置文件和一个ssyy文件夹,ssyy文件夹代表整个ssyy项目的所有内容都在这个文件夹内,这个文件夹内含有ssyy.vcproj的项目配置文件和.h头文件以及.cpp源文件。如果在fangan解决方案下再建立一个新项目名为ssyy2,则会在fangan文件夹下生成一个ssyy2文件夹存放ssyy2项目的所有内容。

      fang

     fang.sln(解决方案配置文件)

     \ssyy

ssyy.vcproj(项目配置文件)

             \ssyy2

ssyy2.vcproj(项目配置文件)

          由上面叙述可以总结出,管理器(解决方案或项目)都会对应一个总的文件夹,这个管理器文件夹下存放本管理器的配置文件以及子管理器。比如,解决方案是个管理器,它的文件夹下含有.sln配置文件以及子管理器ssyy项目和子管理器ssyy2项目。另外,默认情况下,项目属性设置的目录起点为项目配置文件所在位置,实际上就是项目头文件和源文件所在位置。即xxx.vcproj所在的位置

          如果我们建立一个默认的vc项目ssyy,他的默认“常规“栏目中,“输出目录”为$(SolutionDir)$(ConfigurationName),所以调试时会在解决方案文件夹下建立一个debug(ConfigurationName的值为debug)文件夹,并在此文件夹下生成 ssyy.lik链接器 和ssyy.exe文件 。默认“中间目录”为$(ConfigurationName),所以会在ssyy项目文件夹下(即ssyy.vcproj的项目配置文件所在位置)建立一个debug文件夹,并在该文件夹下生成ssyy.obj二进制文件。默认“链接器”栏目下的“常规”选项下的“输出文件”选项为$(OutDir)\$(ProjectName).exe,其中$(OutDir)就已经在“常规”栏目的“输出目录”选项赋值了。

           \ssyy

  \Debug

                  ssyy.exe

             所以$(OutDir)的值是在“输出目录”属性中定义的】。“输出目录”属性只能起到对$(OutDir)系统变量赋值的作用,和“改变生成的.exe文件存放位置”没任何关系。也就是说,如果“输出目录”中设置的$(OutDir)值在C盘,而“输出文件”中设置输出文件的位置为D盘,最终生成的exe文件会在D盘,“输出文件”属性才决定输出exe文件的位置。

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

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

当调试程序时,系统变量$(OutDir)的值是最先确定的,而$(TargetDir)和$(TargetPath)的值是在exe文件生成后才确定的。也就是说系统变量$(OutDir)的值由VS项目的“输出目录”属性决定,而$(TargetDir)和$(TargetPath)的值由VS项目的“输出文件”属性决定。即设置了VS的“输出目录”属性就相当于设置了$(OutDir)的值,“输出目录”是界面上的提示用于接收用户输入的配置信息,然后把这个具体的配置信息存入系统内容的变量$(OutDir)中。(即可以通过属性--常规--输出目录进行修改)

 其它常用的属性还有,“调试”栏目中的“工作目录”项,这个属性默认情况下是空的,但表示工作目录是工程目录,也就是工程配置文件ssyy.vcproj所在目录。

            “工作目录”属性作用是程序运行后唯一识别的默认目录,即工作后只认识这个目录,工作目录这个名字描述的就很形象,(可以将所依赖的libdll库文件所在目录设为工作目录,但一般是把lib放在解决方案下的Lib目录中,把dll放在解决方案下的Bin目录中),例如程序运行过程中生成一个txt文本文件,如果在创建文件过程中未指定绝对路径,只指定创建文件的文件名,那么这个文本文件默认就会建立在工作目录中,当然读取一些配置文件也在工作目录中查找,但要说明一下,生成的exe文件跟工作目录没任何关系,也不会放在工作目录中。总的来说,工作目录就是程序运行过程中默认读取的目录。对于dll,如果是程序运行前就进入内存有点像静态链接那样,此时dll就可以放入exe所在的执行目录,如果dll是运行中动态加载的一般放在工作目录,比如插件就放在工作目录。即工作目录就是运行期间唯一能识别的默认目录,工作目录在代码中用GetCurrentDirectory之类的函数获取,具体代码间最下面的附1。工作目录与执行目录可以不同,例如一个人住在北京,但他的工作地点不一定在北京,可能在天津。

            对工作目录的补充:vs中工作目录的设置是给调试用的,也即你启动调试后,启动一个新进程,自动把这个新进程的工作目录设置为vs项目属性中的工作目录,然后新进程启动对应的exe程序。但是如果不使用vs的调试启动exe,而是直接双击exe文件启动一个新进程时,会自动把这个新进程的工作目录设置为exe文件所在的目录,这是和vs启动调试不同的地方。所以如果发布的时候不把工作目录内的东西拷到exe所在的目录内,就会运行出错,因为此时工作目录不再是vs中设置的了,而是exe文件所在的目录。最后,说一下,vs中默认的vc++工程的工作目录项目的值是空的,代表默认是vs工程所在目录即.vcproj文件所在目录,c#工程默认没测试,估计和vc的一样。】


【同样在调试选项下的和工作目录选项同一级的选项“命令”选项是设置,使用调试时,从哪里启动exe文件,因为一般生成的exe放在bin目录下的debug或release目录下,所以命令选项一般为“Bin\$(Configuration)\$(ProjectName).exe”,默认也是这个值,当然可以更改,但此时意味着调试状态下启动的exe为“命令”选项中设置的exe文件,而不是默认的bin目录下的debug或release下的exe文件了。最后说一下,上面所说的“调试”是指vs下启动exe,包括debug模式和release模式,不要把调试就理解为只有debug模式。】

          “调试”栏目中的“命令(Command)”属性项,【这个属性表示调试器要启动的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),此时调试器就可以正常调试通过。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值