VS 2008 解决方案的目录结构设置和管理 [整理]

主要参考内容来源:

Vs 2008 解决方案的目录结构设置和管理 (http://www.cnblogs.com/wuqi924/archive/2010/12/03/1895244.html) 

VC 2005 解决方案的目录结构设置和管理 (http://wenku.baidu.com/view/c19c134959eef8c75ebfb351.html)

Visual C++ 设置适合自己的解决方案目录结构(http://blog.csdn.net/akof1314/article/details/7190822)(自动生成相应文件夹)

VS2008中VC 项目 文件目录的管理 (http://biancheng.dnbcw.info/c/336026.html)

 

解决方案与项目:
  从VC6之后VC系列就使用解决方案(Solution)来替代原来的工作空间,用于组织和管理多个相关的项目(Project)。
文章首先演示一个虚拟的解决方案和我们期望得到的目录结构,然后使用VC2008的项目设置功能来一步一步达到我们的需求。
虚拟解决方案:
  该虚拟解决方案名为GMA,包含一个动态链接库项目ChocolateMilk一个应用程序项目PureMilk,需要使用一个第三方库log4cxx(Apache log4j的C++移植版本,用于日志输出)。
  log4cxx是以动态库的方式编译的,所以我们需要它的3样东西,分别是头文件,导入库(log4cxx.lib, log4cxxd.lib)和动态链接库(log4cxx.dll)。
假设我们期望的目录结构如下图:
Vs 2008 解决方案的目录结构设置和管理 - chilli - 吥特意滴改变自己 ァ﹏.
1. GMA是解决方案目录
2. PureMilk和ChocolateMilk是项目目录
3. Lib目录用于存放导入库或者静态库(包括第三方库和自己的项目)
4. Include用于存放第三方库的头文件
5. Bin目录存放所有动态链接库和执行档,包括自己的产出和第三方库,区分Release和Debug两个版本。另外,程序运行过程中需要外部的数据文件和启动时需要的配置文件等等都可放于该目录
6. Temp用于存放临时生成文件,其中Compile存放编译器编译时生成的obj文件,Link存放链接器的输出文件。
  
  上面目录结构清晰,一面了然,当我们的程序需要制作安装包或者要打包源码发布的时候,它能够使得我们生活变得更容易^_^
  制作安装包时我们只需将“/GMA/Bin/Release/”目录下的所有文件打包。
  发布和转移源码的时候我们可以打包除了Temp目录以外“/GMA/”下面的所有文件和目录(如果不需要执行档,也可不包括Bin)。
  我们的需求是明确的,可是VC 2008并不会自动为我们做好上面所有的事情。不过我们并不需要编写复杂的编译脚本(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或者Release
IntDir
编译器使用的中间目录,产出obj文件
OutDir
链接器使用的输出目录
ProjectDir
项目目录
ProjectName
项目名字
SolutionDir
解决方案目录
TargetDir
目标输出文件所在的目录
TargetExt
目标输出的扩展名
TargetFileName
目标输出文件名,包括扩展名
TargetName
目标输出名,不包括扩展名
TargetPath
目标输出文件的全路径名

Vs 2008 解决方案的目录结构设置和管理 - chilli - 吥特意滴改变自己 ァ﹏.
 
首先来设置ChocolateMilk动态链接库项目
  1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录
  2.使用“/GMA/Temp/Link/”作为项目链接的输出目录
Vs 2008 解决方案的目录结构设置和管理 - chilli - 吥特意滴改变自己 ァ﹏.
注意高亮的部分,首先将配置改成All Configuration(全部配置),这样可以让我们同时修改Debug和Release的部分;
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栏位:
Vs 2008 解决方案的目录结构设置和管理 - chilli - 吥特意滴改变自己 ァ﹏.
VC可以让我们设置构建前后执行的脚本程序,所以为了完成3,
我们需要写构建后执行的脚本:
Vs 2008 解决方案的目录结构设置和管理 - chilli - 吥特意滴改变自己 ァ﹏.
在Command Line中填入,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没有表示导入库的宏名字 -_-P
OK,到此为止,你就可以编译ChocolateMilk项目试试是不是一切正常了,不过请确认拷贝的目标目录事先建立好。
 
接下来我们设置应用程序项目PureMilk
  1.使用“/GMA/Temp/Compile/”作为项目编译时使用的中间目录
  2.使用“/GMA/Temp/Link/”作为项目链接的输出目录
首先将配置改成All Configuration(全部配置),这样可以让我们同时修改Debug和Release的部分;
Output Directory(输出目录,链接器)栏位填入:$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)
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/”为工作目录
Vs 2008 解决方案的目录结构设置和管理 - chilli - 吥特意滴改变自己 ァ﹏.
Command栏位填入:$(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)
Working Directory栏位填入:$(SolutionDir)\Bin\$(ConfigurationName)\
 
这样就大功告成了,现在你就可以编译该执行程序并进行调试。

补充1:各位兄弟们,那个copy的问题我终于解决了,原来当目标路径的文件夹不存在时,copy命令就不好用了,提示系统找不到指定的路径。,把这句话:
copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\;
换成以下这句就OK了……
xcopy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\
注意,命令变成了xcopy了,而且最后的分号去掉啦,之后即使Bin目录下没有Debug或Release目录编译器也会自动生成的!~

补充2:避免下次编译覆盖文件提示加个“/y” 参数,具体修改如下:
xcopy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\ /y
这回就OK了,如果目标文件正在被使用中的话,会提示“共享侵犯”哦!~

 

 

 

=====================================================================================================

                                 工程中源文件和头文件的管理

=====================================================================================================

  编译一个VC 6的工程(不是自己创建的),编译没有问题,但是工程中有几个头文件是放在目录include下的,我希望更改该目录即使那几个文件不放在include目录下,而是放在工程主目录下,直接移动文件并删除inlcude目录后编译依然没有问题,但是当要编辑那几个头文件时会提示不存在inlcude和该文件,需要新建目录和文件,查看文件属性,发现其中Persist as:..\include\sample.h,头文件仍人在include目录下,没有找到能改更改该项的选项,后来发现在项目下的.dsp文件中包含了项目中各文件的路径,如:
# Begin Group "Header Files"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=..\include\sample.h
# End Source File
...

  在这里更改SOURCE的值即改为SOURCE=.\sample.h就可以了。
  原来这里可以很灵活的对文件进行操作(可以自己增加、删除Group,感觉就是个XML嘛,:( ),以前怎么就没有注意过呢。

如何把项目中的文件分类存放?
  当我们往项目中添加新类时,它会把源文件放在Source Files下,头文件放在Header Files下。当项目中文件很多时,管理不便,最好添加新节点,把文件分类放置。
  右击项目节点树的根节点,选择“New Filter...”,在弹出的对话框中填入新节点名,则新节点就建立了,用鼠标节点树中的文件拖入新节点,就可以把文件分类了。
  以上分类只是在项目的节点树中分类,它不影响文件在磁盘上的位置,所有.cpp文件和.h文件仍在项目的根目录下,最好文件本身也能分类存放在不同文件夹中。
  在Windows下,用“新建文件夹”在项目的根目录下建立子文件夹,如DialogClass,把所有对话框类的.cpp文件和.h文件拖入其中。
  回到VC下,右键单击项目树中更改了路径的节点,选择“Properties”,在弹出的对话框中修改文件路径,如:把原路径“.\Dialog1.cpp”改为“.\DialogClass\Dialog1.cpp”。
  打开Dialog1.cpp文件,修改它包含的文件路径。如:
#include "stdafx.h"
#include "PluckBox.h"
#include "Dialog1.h"
改为:
#include "stdafx.h"
#include "..\\PluckBox.h"
#include "Dialog1.h"
  打开ClassWizard,它会提示你文件不存在,单击“确定”后,从对话框中用“Browse...”选择文件所在路径,则ClassWizard也可正常使用了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章