VisualC++使用解决方案来管理项目,项目之间还可能有依赖关系,设置适合自己的解决方案目录结构,便于代码的管理、程序的发布。下面开始一个虚拟解决方案设计:假设此解决方案有应用程序项目A,动态链接库项目B,静态链接库项目C,其中项目A依赖项目B和项目C,则构建解决方案项目结构如下图所示:而目录结构则如下图所示:Bin:存放所有动态链接库和可执行程序,分Debug和Release两个版本A:应用程序项目文件夹B:动态链接库项目文件夹C:静态链接库项目文件夹Doc:存放项目文档Include:存放引用库的头文件Lib:存放动态链接库的导入库、静态链接库Temp:存放临时生成文件,其中Compile存放编译时的中间文件,Link存放链接时的输出文件除了Doc需要自己建立外,其他文件夹无需手动建立。项目结构创建步骤:1.创建一个新应用程序项目,名称A,解决方案名称为Work,如下图所示:2.在解决方案资源管理器右键解决方案Work,添加→新建项目→Win32→Win32项目,名称为B,在应用程序设置选择DLL和空项目;3.同样的方式添加一个Win32项目,名称为C,在应用程序设置选择静态库,去掉预编译头选项;4.项目结构如下图所示:项目属性设置配置项目A的属性1.配置所有配置,常规,输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(PlatformName)\$(ConfigurationName)中间目录:$(SolutionDir)Temp\Compile\$(ProjectName)\$(PlatformName)\$(ConfigurationName)2.生成事件→生成后事件,命令行:echoD|xcopy$(TargetPath)$(SolutionDir)Bin\$(PlatformName)\$(ConfigurationName)/y3.C/C++→常规,附加包含目录:$(SolutionDir)Include4.链接器→常规,附加库目录:$(SolutionDir)Lib\$(PlatformName)5.调试,命令:$(SolutionDir)Bin\$(PlatformName)\$(ConfigurationName)\$(TargetFileName)工作目录:$(SolutionDir)Bin\$(PlatformName)\$(ConfigurationName)配置项目B的属性1.配置所有配置,常规下,输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(PlatformName)\$(ConfigurationName)中间目录:$(SolutionDir)Temp\Compile\$(ProjectName)\$(PlatformName)\$(ConfigurationName)2.【VS2008】配置Debug,链接器→常规下,输出文件:$(SolutionDir)Temp\Link\$(ProjectName)\$(PlatformName)\$(ConfigurationName)\$(ProjectName)d.dll【VS2010及以上】配置Debug,常规下,目标文件名:$(ProjectName)d3.配置所有配置,生成事件→生成后事件下,命令行:echoD|xcopy$(TargetPath)$(SolutionDir)Bin\$(PlatformName)\$(ConfigurationName)/yechoD|xcopy$(TargetDir)$(TargetName).lib$(SolutionDir)Lib\$(PlatformName)/yechoD|xcopy$(ProjectDir)B.h$(SolutionDir)Include/y第三行为xcopy动态库的头文件,实际要根据所需进行改动名称。配置项目C的属性1.配置所有配置,常规下,输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(PlatformName)\$(ConfigurationName)中间目录:$(SolutionDir)Temp\Compile\$(ProjectName)\$(PlatformName)\$(ConfigurationName)2.【VS2008】配置Debug,管理员→常规下,输出文件:$(SolutionDir)Temp\Link\$(ProjectName)\$(PlatformName)\$(ConfigurationName)\$(ProjectName)d.lib【VS2010及以上】配置Debug,常规下,目标文件名:$(ProjectName)d3.配置所有配置,生成事件→生成后事件下,命令行:echoD|xcopy$(TargetPath)$(SolutionDir)Lib\$(PlatformName)/yechoD|xcopy$(ProjectDir)C.h$(SolutionDir)Include/y第二行为xcopy静态库的头文件,实际要根据所需进行改动名称。最后设置项目生成顺序菜单栏→项目→项目依赖项,项目A依赖于B和C,如下图所示:编译生成,可看到如下结果:用tree命令看下文件夹结构:解决方案与项目:从VC6之后VC系列就使用解决方案(Solution)来替代原来的工作空间,用于组织和管理多个相关的项目(Project)。文章首先演示一个虚拟的解决方案和我们期望得到的目录结构,然后使用VC2008的项目设置功能来一步一步达到我们的需求。虚拟解决方案:该虚拟解决方案名为GMA,包含一个动态链接库项目ChocolateMilk和一个应用程序项目PureMilk,需要使用一个第三方库log4cxx(Apachelog4j的C++移植版本,用于日志输出)。log4cxx是以动态库的方式编译的,所以我们需要它的3样东西,分别是头文件,导入库(log4cxx.lib,log4cxxd.lib)和动态链接库(log4cxx.dll)。假设我们期望的目录结构如下图:1.GMA是解决方案目录2.PureMilk和ChocolateMilk是项目目录3.Lib目录用于存放导入库或者静态库(包括第三方库和自己的项目)4.Include用于存放第三方库的头文件5.Bin目录存放所有动态链接库和执行档,包括自己的产出和第三方库,区分Release和Debug两个版本。另外,程序运行过程中需要外部的数据文件和启动时需要的配置文件等等都可放于该目录6.Temp用于存放临时生成文件,其中Compile存放编译器编译时生成的obj文件,Link存放链接器的输出文件。上面目录结构清晰,一面了然,当我们的程序需要制作安装包或者要打包源码发布的时候,它能够使得我们生活变得更容易^_^制作安装包时我们只需将“/GMA/Bin/Release/”目录下的所有文件打包。发布和转移源码的时候我们可以打包除了Temp目录以外“/GMA/”下面的所有文件和目录(如果不需要执行档,也可不包括Bin)。我们的需求是明确的,可是VC2008并不会自动为我们做好上面所有的事情。不过我们并不需要编写复杂的编译脚本(makefile),只需要简单的修改项目的缺省设置即可。我们需要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/”为工作目录首先看一下项目设置中可以使用的宏,常用的有:ConfigurationName配置名字,通常是Debug或者ReleaseIntDir编译器使用的中间目录,产出obj文件OutDir链接器使用的输出目录ProjectDir项目目录ProjectName项目名字SolutionDir解决方案目录TargetDir目标输出文件所在的目录TargetExt目标输出的扩展名TargetFileName目标输出文件名,包括扩展名TargetName目标输出名,不包括扩展名TargetPath目标输出文件的全路径名首先来设置ChocolateMilk:1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录2.使用“/GMA/Temp/Link/”作为项目链接的输出目录注意高亮的部分,首先将配置改成AllConfiguration(全部配置),这样可以让我们同时修改Debug和Release的部分;OutputDirectory(输出目录,链接器)栏位填入:$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)IntermediateDirectory(中间目录,编译器)栏位填入:$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)3.构建结束后拷贝动态链接库到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,拷贝导入库到“/GMA/Lib/”我们通常都会在Debug版本的输出库后面加上字母“d”以表示这是Debug版本,在Debug配置下,修改ImportLibrary栏位:VC可以让我们设置构建前后执行的脚本程序,所以为了完成3,我们需要写构建后执行的脚本:在CommandLine中填入,Debug配置下:copy$(TargetPath)$(SolutionDir)\Bin\$(ConfigurationName)\;copy$(TargetDir)$(TargetName)d.lib$(SolutionDir)\Lib\;Release配置下:copy$(TargetPath)$(SolutionDir)\Bin\$(ConfigurationName)\;copy$(TargetDir)$(TargetName).lib$(SolutionDir)\Lib\;之所以要分别设置是因为VC没有表示导入库的宏名字-_-POK,到此为止,你就可以编译ChocolateMilk项目试试是不是一切正常了,不过请确认拷贝的目标目录事先建立好。接下来我们设置应用程序项目PureMilk:1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录2.使用“/GMA/Temp/Link/”作为项目链接的输出目录首先将配置改成AllConfiguration(全部配置),这样可以让我们同时修改Debug和Release的部分;OutputDirectory(输出目录,链接器)栏位填入:$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)IntermediateDirectory(中间目录,编译器)栏位填入:$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)3.构建结束后拷贝执行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”在CommandLine中填入,All配置下:copy$(TargetPath)$(SolutionDir)\Bin\$(ConfigurationName);4.调试时运行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的执