visual studio中解决方案的路径管理和路径宏

说明:

在介绍项目配置之前,先说明两点。

      1. 项目配置中,最好不要使用相对路径,更不要使用绝对路径,应尽量使用宏来指定所有路径。这样能保证程序的可移植性。

         请在以下地方查看VS2008中与路径相关的宏: 

               a.C/C++ -> 常规 -> 附加包含目录;

               b.点击右边的按钮,会弹出一个对话框;

               c.点击右下角的宏按钮,就可以看到所有的宏

     2. 在进行项目设置的时候,如果Debug和Release下具有相同的属性,那么,在属性页中,最好配置选项设置为:所有配置。这样,可以同时修改Debug和Release部分。

       为了实现合理的目录结构,在建立工程项目的时候需要进行如下配置。其中,前三项是必须修改的指定的设置,后面用户可选。        

    1)配置项目的输出目录和中间目录

             配置属性 -> 常规 -> 输出目录:

                              $(SolutionDir)Build\Link\$(ProjectName)\$(ConfigurationName)

             配置属性 -> 常规 -> 中间目录:

                             $(SolutionDir)Build\Compile\$(ProjectName)\$(ConfigurationName)

    2) 配置输出文件所在目录

            链接 -> 常规 -> 输出文件:

                            $(OutDir)\$(ProjectName).dll

           链接 -> 常规 -> 附加库目录:

                           $(SolutionDir)lib\$(ConfigurationName)

           其它项目如VBCSwitcher,如果也要引用当前lib中的库,则附加库目录为:

                          $(SolutionDir)..\ebase\Lib\$(ConfigurationName)

   3) 配置生成后事件,将输出目录中的最终输出文件拷贝到bin目录中,同时将输出的lib文件拷贝到lib目录中。

           生成事件 -> 生成后事件 -> 命令行:

                         copy $(TargetPath) $(SolutionDir)Bin\$(ConfigurationName)

                         copy $(TargetDir)$(TargetName).lib $(SolutionDir)Lib\$(ConfigurationName)

          其它项目,如VBCSwitcher,如果也要输出到此目录,则生成后事件可写为:

                         copy $(TargetPath) $(SolutionDir)..\ebase\Bin\$(ConfigurationName)

                         copy $(TargetDir)$(TargetName).lib $(SolutionDir)..\ebase\Lib\$(ConfigurationName)

          如果有需要注册的控件,也可以在生成后事件中完全注册:

                         echo regsvr32 $(TargetFileName) >> $(SolutionDir)Bin\$(ConfigurationName)\register.bat

                         echo regsvr32 /u $(TargetFileName) >> $(SolutionDir)Bin\$(ConfigurationName)\unregister.bat

   4) 如果要指定调试命令和工作目录,则在下面的地方设置

           调试 -> 命令:

                         $(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)

           调试 -> 工作目录:

                        $(SolutionDir)\Bin\$(ConfigurationName)\

VC2005 解决方案的目录结构设置和管理

         一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于单元测试,还有的产出最终的应用程序执行档。除此之外,根据项目的需求,还会使用一些第三方的库。

       所以,为解决方案设置一个合理的目录结构,不但可以使得代码管理更井井有条,项目成员之间也更容易相互配合,更重要的是能够使得最终应用程序的安装包制作,源代码打包发布和转移变得十分容易。

解决方案与项目:

       从VC6之后VC系列就使用解决方案(Solution)来替代原来的工作空间,用于组织和管理多个相关的项目(Project)。

以下内容首先演示一个虚拟的解决方案和我们期望得到的目录结构,然后使用VC2005的项目设置功能来一步一步达到我们的需求。

1. 虚拟解决方案:

       该虚拟解决方案名为GMA,包含一个动态链接库目录ChocolateMilk和一个应用程序项目PureMilk,需要使用一个第三方库log4cxx (Apache log4j 的C++移植版本,用于日志输出)。

      log4cxx是以动态库的方式编译的,所以我们需要它的3样东西,分别是头文件,导入库(log4cxx.lib,log4cxxd.lib)和动态链接库(log4cxx.dll)。

       假设我们期望的目录结构如下图:

                                             

      1)GMA是解决方案目录

      2)PureMilk和ChocolateMilk是项目目录

      3)Lib目录用于存放导入库或者静态库(包括第三方库和自己的项目)

      4)Incl?用于存放第三方库的头文件

      5)Bin目录存放所有动态链接库和执行档,包括自己的产出和第三方库,区分Release和Debug两个版本。另外,程序运行过程中需要外部的数据文件启动时需要的配置文件等等都可放于该目录。

      6)Temp用于存放临时生成文件,其中Compile存放编译器编译生成的obj文件,Link存放链接器的输出文件。

      上面的目录结构清晰,一面了然,当我们的程序需要制作安装包或者要打包源码发布的时候,它能够使得我们的操作变得更容易。制作安装包时,我们只需要将“/GMA/Bin/Release/”目录下的所有文件打包。  发布和转移源码的时候我们可以打包除了Temp目录以外“/GMA/”下面的所有文件和目录(如果不需要执行档,也可不打包Bin)

      我们的需求是明确的,可是 VC2005并不会自动为我们做好上面所有的事情。不过我们并不需要编写复杂的编译脚本(makefile),只需要简单的修改项目的缺省设置即可。

2. 我们需要VC为我们做的事情包括:

     1)使用“/GMA/Temp/Compile”作为项目编译时使用的中间目录

     2)使用“/GMA/Temp/Link”作为项目链接的输出目录

     3)当项目是应用程序时,在构建结束后拷贝执行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug”,当项目是动态链接库时,除了拷贝dll到Bin,还拷贝倒入库到“/GMA/Lib/”

     4)当项目是应用程序时,调试时运行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的执行文件,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”为工作目录

     首先,看一下项目设置中可以使用的宏,常用的有:

Configuration 配置名字,通常是Debug或者Release
IntDir 编译器使用的中间目录,产出obj文件
OutDir 链接器使用的输出目录
ProjectDir 项目目录
ProjectName 项目名字
SolutionDir 解决方案目录
TargetDir 目标输出文件所在的目录
TargetExt 目标输出的拓展名
TargetFileName 目标输出文件名,包括拓展名
TargetName 目标输出名,不包括拓展名
TargetPath 目标输出文件的全路径名

                                          

 首先来设置ChocolateMilk:

 1)使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录

 2)使用“/GMA/Temp/Link/”作为项目链接的输出目录

              

请注意高亮的部分。

       1)首先将配置改成 All Configuration(全部配置),这样可以让我们同时修改Debug和Release的部分;

       2)Output Directory(输出目录,链接器)栏位填入:

                            $(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)

            Intermediate Directory(中间目录,编译器)栏位填入:

                           $(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)

      3)构建结束后,拷贝动态链接库到"/GMA/Bin/Release"或"/GMA/Bin/Debug/",拷贝导入库到“/GMA/Lib”     。

我们通常都会在Debug版本的输出库后面加上字母"d"以表示这是Debug版本,在Debug配置下,修改import Library栏位:

                   

VC可以让我们设置构建前后执行的脚本程序,所以为了完成3,我们需要写构建后执行的脚本:

              

      在Command Line中填入,Debug配置下:

               copy $(TargetPath) $(SolutionDir)\$(ConfigurationName)\;

               copy $(TargetDir) $(TargetName)d.lib $(SolutionDir)\Lib\;

      Release配置下:

               copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\;

               copy $(TargetDir) $(TargetName).lib $(SolutionDir)\Lib\;

     之所以要分别设置是因为VC没有表示导入库的宏名字

     OK,到此为止,你就可以编译ChocolateMilk项目试试是不是一切正常了,不过确认拷贝的目标目录事先建立好。

接下来设置应用程序项目PureMilk:

     1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录

     2.使用“/GMA/Temp/Link”作为项目链接时的输出目录

具体的,

         1)将配置改成 All Configuration(全部配置),这样可以让我们同时修改Debug和Release的部分;

         2)Output Directory(输出目录、链接器)栏位填入:

                   $(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)

         3)Intermediate Directory(中间目录,编译器)栏位填入:

                  $(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)

    3.构建结束后拷贝执行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”

         在Command Line中填入,All配置下:

                 copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName);

    4.在调试时运行“/GMA/Bin/Debug”或“/GMA/Bin/Release/”下面的执行文件,并以"/GMA/Bin/Debug/"或"/GMA/Bin/Release/"作为工作目录

        

       Command栏位填入:$(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)

       Working Directory栏位填入:$(SolutionDir)\Bin\$(ConfigurationName)\

这样就大功告成了,现在你就可以编译该执行程序并进行调试。

附录

本附录介绍了vs中大部分常用的路径宏。

vs中的路径宏
                          宏                                                       说明
$(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的值。有关更多信息,请参加更改用于C/C++调试配置的项目设置。
$(References) 以分号分隔的引用列表被添加到项目中
$(ConfigurationName) 当前项目配置的名称(例如“Debug”)
$(PlatformName) 当前项目平台的名称(例如"Win32")
$(Inherit) 指定在由项目生成系统所撰写的命令行中,继承的属性出现的顺序。默认情况下,继承的属性重新拿在当前属性的末尾。
$(NoInherit) 使任何被继承的属性不被继承。若还要避免同级别的计算,请使用$(StopEvaluation)。使用$(NoInherit)会导致对于同一属性忽略任何出现的$(Inherit)
$(StopEvaluation) 立即停止计算链中宏的计算。出现在$(StopEvaluation)之后的任何值将不出现在宏的计算值中。如果$(StopEvaluation)在$(Inherit)之前,计算链中当前位置的继承值将不会连接到宏值。$(StopEvaluation)是$(NoInherit)的功能超集。
$(ParentName) 包含此项目的项的名称。该名称将是父文件夹名称或项目名称
$(RootNameSpace) 包含应用程序的命名空间(如果有)
$(IntDir) 为中间文件指定的相对于项目目录的目录路径。它解析为“中间目录”属性的值
$(OutDir) 输出文件目录的路径,相对于项目目录。这解析为“中间目录”属性的值
$(DevEnvDir) Visual Studio .NET的安装目录(定义形式:驱动器+路劲);包括尾部的反斜杠“\”。
$(InputDir) 输入文件的目录(定义形式:驱动器+路径):包括尾部的反斜杠“\”。如果该项目是输入,则此宏等效于$(ProjectDir)
$(InputPath) 输入文件的绝对路径名(定义形式:驱动器+路径+路径+基本名称+文件扩展名)。如果该项目是输入,则此宏等效于$(ProjectPath)
$(InputName) 输入文件的基本名称。如果该项目是输入,则此宏等效于$(ProjectName)
$(InputFileName) 输入文件的文件名(定义为基本名称+文件扩展名)。如果该项目是输入,则此宏等效于$(ProjectFileName)。
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

猜你喜欢

转载自blog.csdn.net/aishuirenjia/article/details/107904616