一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于单元测试,还有的产出最终的应用程序执行档。除此以外,根据项目的需求,还会使用一些第三方的库。
所以为解决方案设置一个合理的目录结构,不但可以使得代码管理更井井有条,项目成员之间也更容易相互配合,更重要的是能够使得最终应用程序的安装包制作,源代码打包发布和转移变得十分容易。
解决方案与项目:
从VC6之后VC系列就使用解决方案(Solution)来替代原来的工作空间,用于组织和管理多个相关的项目(Project)。
文章首先演示一个虚拟的解决方案和我们期望得到的目录结构,然后使用VS的项目设置功能来一步一步达到我们的需求。
虚拟解决方案:
该虚拟解决方案名为GMA,包含一个动态链接库项目ChocolateMilk和一个应用程序项目PureMilk,需要使用一个第三方库log4cxx(Apache log4j的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)。
我们的需求是明确的,可是VS并不会自动为我们做好上面所有的事情。不过我们并不需要编写复杂的编译脚本(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 |
目标输出文件的全路径名
|
首先来设置ChocolateMilk:
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\”,拷贝导入库到“\GMA\Lib\”
我们通常都会在Debug版本的输出库后面加上字母“d”以表示这是Debug版本,在Debug配置下,修改Import Library栏位:

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

在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\”为工作目录
Command栏位填入:$(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)
Working Directory栏位填入:$(SolutionDir)\Bin\$(ConfigurationName)\
这样就大功告成了,现在你就可以编译该执行程序并进行调试。
- [转]Vs解决方案的目录结构设置和管理
原文地址:[转]Vs解决方案的目录结构设置和管理 作者:大明 以下内容为“原创”+“转载” 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对 ...
- Vs 2008 解决方案的目录结构设置和管理(转)
http://blog.csdn.net/lcj_cjfykx/article/details/8632459 MS的这个IDE,实在庞杂得恐怖.从大学开始,我就一直用VC的各个版本写程序至今,细细想 ...
- VC 2005 解决方案的目录结构设置和管理
VC 2005 解决方案的目录结构设置和管理 Roger (roger2yi@gmail.com) 一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于 ...
- Visual Studio解决方案的目录结构设置和管理
摘至:http://blog.csdn.net/lp310018931/article/details/47991759 首先,解决方案和项目文件夹包含关系(c++项目): 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 ...
随机推荐
- Cooperation.GTST团队第二周项目总结
项目进展 这周我们把工作主要放在了UI界面的实现上,为了让整款APP看上去能够更加高大上,我们决定采用Android 5.0开始推出的一个Material Design风格的导航控件Toolbar. ...
- ubuntu16.04深度学习环境的配置【转】
本文转载自:https://my.oschina.net/u/3837179/blog/1920756 在ubuntu中配置GPU的深度学习环境相较于win问题要多很多,这几天琢磨了一下Ubuntu下 ...
- Asp.net下拉树实现(Easy UI ComboTree)
场景描述:某个公司有多个部门并且部门存在子部门,通过一个下拉框选取多个部门,但是如果某个部门的子部门被全部选择,则只取该部门,而忽略子部门.(叶子节点全被选中时,只取父节点) 知识点:ComboTre ...
- Github 下载项目的某一分支版本
参考:如何在 GitHub 下载某个程序的特定版本(代码)? 在安装ntf做int实验的时候,发现int demo的这个repo是该项目的一个branch,与master分支不一致(5 commits ...
- Java发送带html标签内容的邮件
package test; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; im ...
- SpringMVC注解@RequestMapping @RequestParam @ResponseBody 和 @RequestBody 解析
SpringMVC Controller层获取参数及返回数据的方式: @RequestMapping @RequestMapping(“url”),这里的 url写的是请求路径的一部分,一般作用在 C ...
- WPF特效和例子
https://www.cnblogs.com/AaronYang/p/4710428.html
- HDU 1969 精度二分
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- vue触底,触顶事件
data(){ return{ songList: [], //歌单列表 totalPage: "", total: "", pageSize: 10, thi ...
- 毒害一代Java程序猿的HttpClient
前言 2016年以来,越来越多Android开发者使用Retrofit作为HTTP请求框架.原因其一,Google发布Android 6.0 SDK (API 23) 抛弃了HttpClient:其二 ...