Vs 2008 解决方案的目录结构设置和管理(转)
http://blog.csdn.net/lcj_cjfykx/article/details/8632459
MS的这个IDE,实在庞杂得恐怖。从大学开始,我就一直用VC的各个版本写程序至今,细细想来,也仅仅是窥豹一斑,羞愧不已。但若仔细翻阅文档,又觉得时间花得不值,于是便一直凑活地用着。
前段时间负责搭建新项目的开发环境,兼一直在看Gamebryo的代码,从中借鉴了不少工程管理的方法。结合以前使用VC的经验,现总结下来与大家分享,希望能起到抛砖引玉的作用。
项目目录结构
VC用解决方案(solution)来表示项目,每个项目由一个或多个工程(project)组成,每个project用来管理一个相对独立的模块。有些大型的项目,例如Gamebryo,甚至会有多个solution:一个solution用来管理LIB或DLL;一个solution用来管理所有的DEMO;一个solution用来管理tools等等。拆分成多个工程,好处之一是结构清晰,二是方便并行开发。每个project由不同的程序员维护,输出LIB或DLL,再链接生成最终的EXE。项目的拆分是很有技术含量的,可以看出设计的功力。拆分得不好,就会产生一些诸如”project间相互依赖”的负面效应。
建立项目的时候,第一件要考虑的事情就是如何配置文件目录结构。如果是只有几个obj的微型项目,将所有东西全部扔到一个目录下也未尝不可(当然,这依然是最糟糕的做法);而对于包含N个project,一大堆的源代码,还有文档,资源等等的大项目,糟糕的文件管理会把事情弄成一团浆糊。优秀的目录配置可以帮助开发者迅速找到需要的东西,很容易就可以添加新的模块和代码,甚至反映出项目的基础架构…最后,好的目录结构,是充满美感的:)
下面就是本人比较喜欢的目录结构设置,实际中根据项目大小和需求有所增减:
src:存放所有的源代码
build:存放所有的工程文件(solution,project,makefile等)
doc:项目文档,doxygen文件等
sdk:工程依赖的所有库文件和头文件
out:编译器产生的中间文件,目标文件
bin:编译得到的exe和dll
上图没有列出来,但通常还会有:
res:资源目录,可执行文件需要用到的各种图像,声音,模型,场景,UI等资源文件
script:存放脚本文件
tool:各种自动化工具
稍微说明一下:一是最重要的源码要单独放一个目录,且不同模块的代码都归置到不同的子目录下。这样的好处是,别人只需要看一眼你的目录结构,就大概知道你工程是怎样的一个架构了。我讨厌所有header放一个目录,所有cpp放另一个目录的做法,想找个文件都很痛苦。
二是工程文件(vc solution,project,makefile等)单独放一个目录。工程文件的重要程度仅次于源码,无工程文件,别人要编译或浏览你的代码都很杯具。插一句,有VC Project的话,Windows下用VC看代码真的是不二之选(当然,Linux下的工具集自不必提),再次就是Editplus+Everything了。话说回来,专业一点的话,build下应该有两个子目录:MSVC和MakeFile,当然还可以有CodeBlock,CodeLite等等。VC工程的话,solution,project和property sheet也应该分开存放
然后就是静态库。每个项目都应该是自给自足的,即整个项目目录我随便copy到什么地方,都照样能编译运行。所以必须要包含所有项目依赖的第三方的库文件和相关的头文件。还有我们的project本身也可能会输出lib,也应该放在同样的目录下,这样方便设置搜索路径。
最后就是编译过程中产生的中间文件,这些我全部扔到out目录里,按"“project_name /[debug | release | shipping] /”分目录存放,一是清理方便,二是看着舒心,最近我还发现这样还能避免链接静态库时的PCH Replacing的问题。而exe和DLL我输出到bin下,Lib则输出到SDK,debug版带后缀_d,release版带后缀_r,类似地shipping版带后缀_s
接下来会具体聊一下project属性的设置…
解决方案与项目:

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





Visual C++ 使用解决方案来管理项目,项目之间还可能有依赖关系,设置适合自己的解决方案目录结构,便于代码的管理、程序的发布。
下面开始一个虚拟解决方案设计:
假设此解决方案有应用程序项目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)\$(ConfigurationName)
中间目录:$(SolutionDir)Temp\Compile\$(ProjectName)\$(ConfigurationName)
2."生成事件"→"生成后事件",
命令行:echo D | xcopy "$(TargetPath)" "$(SolutionDir)Bin\$(ConfigurationName)" /y
3."C/C++"→"常规",
附加包含目录:$(SolutionDir)Include
4."链接器"→"常规",
附加库目录:$(SolutionDir)Lib
5."调试",
命令:$(SolutionDir)Bin\$(ConfigurationName)\$(TargetFileName)
工作目录:$(SolutionDir)Bin\$(ConfigurationName)
配置项目B的属性
1.配置"所有配置","常规"下,
输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)
中间目录:$(SolutionDir)Temp\Compile\$(ProjectName)\$(ConfigurationName)
2.配置"Debug","链接器"→"常规"下,
输出文件:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)\$(ProjectName)d.dll
3.配置"所有配置","生成事件"→"生成后事件"下,
命令行:
echo D | xcopy "$(TargetPath)" "$(SolutionDir)Bin\$(ConfigurationName)" /y
echo D | xcopy "$(TargetDir)$(TargetName).lib" "$(SolutionDir)Lib" /y
echo D | xcopy "$(ProjectDir)B.h" "$(SolutionDir)Include" /y
第三行为xcopy动态库的头文件,实际要根据所需进行改动名称。
配置项目C的属性
1.配置"所有配置","常规"下,
输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)
中间目录:$(SolutionDir)Temp\Compile\$(ProjectName)\$(ConfigurationName)
2.配置"Debug","管理员"→"常规"下,
输出文件:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName)\$(ProjectName)d.lib
3.配置"所有配置","生成事件"→"生成后事件"下,
命令行:
echo D | xcopy "$(TargetPath)" "$(SolutionDir)Lib" /y
echo D | xcopy "$(ProjectDir)C.h" "$(SolutionDir)Include" /y
第二行为xcopy静态库的头文件,实际要根据所需进行改动名称。
最后设置项目生成顺序
菜单栏→"项目"→"项目依赖项",项目A依赖于B和C,如下图所示:
编译生成,可看到如下结果:
用tree命令看下文件夹结构:
其他网上关于目录结构配置资料:
1.VC 2005 解决方案的目录结构设置和管理 http://blog.csdn.net/rogeryi/article/details/1481923
2.VC项目管理:目录结构 http://www.fancystar.org
3.VS2008中VC项目文件目录的管理 http://qimo601.iteye.com/blog/1059299
4.研发规范-VC http://wenku.baidu.com/view/26f6c789680203d8ce2f2414.html
Vs 2008 解决方案的目录结构设置和管理(转)的更多相关文章
- [转]Vs解决方案的目录结构设置和管理
原文地址:[转]Vs解决方案的目录结构设置和管理 作者:大明 以下内容为“原创”+“转载” 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对 ...
- VC 2005 解决方案的目录结构设置和管理
VC 2005 解决方案的目录结构设置和管理 Roger (roger2yi@gmail.com) 一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于 ...
- Visual Studio解决方案的目录结构设置和管理
摘至:http://blog.csdn.net/lp310018931/article/details/47991759 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件 ...
- VS解决方案的目录结构设置和管理
一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于单元测试,还有的产出最终的应用程序执行档.除此以外,根据项目的需求,还会使用一些第三方的库. 所以为解决 ...
- VS下的解决方案目录结构设置和管理
转载:http://blog.csdn.net/pl20140910/article/details/52074165 为了方便管理自己写的代码,也为了日后工作能方便的查找之前做过相同的代码,仿照某源 ...
- VS 解决方案目录结构设置
涉及到的配置: 项目编译时使用的中间目录: 项目链接的输出目录: 项目编译结束后,拷贝生成的 dll 和 lib 到指定目录: 项目编译结束后,拷贝需要的 dll 到输出目录: 设置项目的工作目录: ...
- 转: VS 解决方案目录结构设置
https://www.cnblogs.com/zuibunan/p/3843459.html 下面的文章也有介绍 https://blog.csdn.net/lp310018931/article/ ...
- ECMALL目录结构设置与数据库表
[Ecmall]ECMALL目录结构设置与数据库表 最近在做ecmall的开发,ecmall在开源方面还有待进步啊,官方没有提供开发文档,也没有关于系统架构组织的贡献,使用者都要自己从0开始,官方 ...
- Unity目录结构设置
摄像机 Main Camera 跟随主角移动,不看 UI 剧情摄像机 当进入剧情时,可以关闭 main camera,启用剧情摄像机,不看 UI UI 摄像机 看 UI Unity编辑器常用的sett ...
随机推荐
- tyvj1161聚会的名单(trie树)
背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description 明天就是candy的生日.晚上,c ...
- NopCommerce源码架构详解--初识高性能的开源商城系统cms
很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...
- [Everyday Mathematics]20150102
设 \[ a_1=3,\quad a_{n+1}=\dfrac{1}{2}(a_n^2+1)\quad(n=1,2,\cdots). \] 试求 \[ \vsm{n}\dfrac{1}{1+a_n}. ...
- 淘宝JAVA中间件Diamond详解(2)-原理介绍
淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...
- 《深入Java虚拟机学习笔记》- 第1章 Java体系结构
一.体系结构组成 当编写并运行一个Java程序时,就同时体验了这四种技术.用Java语言编写源代码,编译成Java Class文件,然后再在Java虚拟机上运行class文件.当编写程序时,通过调用类 ...
- HDU 1495 非常可乐 BFS搜索
题意:有个为三个杯子(杯子没有刻度),体积为s,n,m,s=m+n, 刚开始只有体积为s的杯子装满可乐,可以互相倒,问你最少的次数使可乐均分,如果没有结果,输出-1; 分析:直接互相倒就完了,BFS模 ...
- iOS动画原理
1. iOS动画原理 本质:动画对象(这里是UIView)的状态,基于时间变化的反应 分类:可以分为显式动画(关键帧动画和逐帧动画)和隐式动画 关键帧和逐帧总结:关键帧动画的实现方式,只需要修改某个属 ...
- [LeetCode]切割字符串,使各个子串都是回文
题目:Given a string s, partition s such that every substring of the partition is a palindrome. Return ...
- 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns
UVAlive 4670 Dominating Patterns 题目: Dominating Patterns Time Limit: 3000MS Memory Limit: Unkn ...
- [读书笔记]了不起的node.js(二)
这周做项目做得比较散(应该说一直都是这样),总结就依据不同情境双开吧-这篇记录的是关于node的学习总结,而下一篇是做项目学到的web前端的知识. 1.HTTP篇 node的HTTP模块在第一篇时接触 ...