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

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

 

Roger (roger2yi@gmail.com)

 

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

 

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

 

解决方案与项目:

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

 

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

 

 

虚拟解决方案:

 

该虚拟解决方案名为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)。

 

我们的需求是明确的,可是VC 2005并不会自动为我们做好上面所有的事情。不过我们并不需要编写复杂的编译脚本(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栏位:

 

 

 

VC可以让我们设置构建前后执行的脚本程序,所以为了完成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)/

 

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

时间: 2024-10-22 07:03:17

VC 2005 解决方案的目录结构设置和管理的相关文章

在Windows 2003活动目录中设置和管理发布打印机

在Windows 2000/2003中建立打印机时,打印机和活动目录通过缺省配置成具有整体性,打印机将自动 在活动目录上发布.对于不是运行Windows 2000/2003计算机(如Windows NT 4.0)上的打印机,不能在 AD中进行自动发布,可利用活动目录管理工具或利用system32文件夹中提供的pubprn.vbs脚本在活动目录 中进行手动发布. 4.4.1 Windows 2000/2003域中打印机的发布 在Win2000/2003域中的一台Member Server上安装打印

【小技巧】自定义asp.net mvc的WebFormViewEngine修改默认的目录结构

先看一下我的解决方案的目录结构吧--- 一:先把Controller程序提取出来 默认的情况是所有的****Controller.cs文件都会放在Web程序集下的一个叫Controllers的文件夹下 这样感觉有点不爽(你懂的...) 我们决定把所有的Controller程序放到一个自定义的应用程序集中去(上图中的mrlh.Admin.Controllers) 先把web程序集下的Global.asax.cs文件删掉 然后把Global.asax的标记代码改为如下: <%@ Applicatio

02_Weblogic课程之安装篇:RedHat下JDK安装,RedHat下Weblogic安装,目录结构,环境变量设置

 1  Weblogic的安装方式有三种: 一.GUI方式安装    (java –jar wls1035_generic.jar [-mode=gui])这是默认的 二.Console方式安装   (java –jar wls1035_generic.jar –mode=console) 三.Silent方式安装(静默方式) :这种方式不需要认为干预,默认安装的,适合作集群的时候使用,需要一个配置文件    (java –jar wls1035_generic.jar –mode=sile

ThinkPHP中自定义目录结构的设置方法_php技巧

效果如图所示: 入口文件 <?php // 应用入口文件 // 检测PHP环境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 网站文件入口位置 define('ABSPATH', dirname(__FILE__) . '/'); // 定义应用目录 define('APP_NAME', 'WEBSITE'); define('APP_PATH','./include/'); d

vc++-求大神改个程序,改成用文件操作的,我的程序VC++2005 写的

问题描述 求大神改个程序,改成用文件操作的,我的程序VC++2005 写的 #include #include #include using namespace std; typedef struct stu//定义一个结构体作为类的私有成员 { int num; string name; }; class student //学生类为基类 { protected: stu a[100]; int i, n; static int d;//计算输入学生总数 public: student();/

vc++-急求用VC++2005文件写的学生管理系统,不用MFC界面,DOS就可以

问题描述 急求用VC++2005文件写的学生管理系统,不用MFC界面,DOS就可以 大致三个模块,模块功能如下 第一块:登录模块及权限设置模块 (1)管理员/学生登录模块:设置/修改密码:不同类型人员的权限设置(管理员可以修改信息,学生只能查询信息) 第二块:管理员模块 (2)面向管理员的学生信息管理模块:加入学生信息:根据各种特征方便的查找学生信息:学生信息的管理: (3)面向管理员的课程及成绩管理模块:各学年所修课程及其成绩管理. 第三块:学生模块 (4)面向学生的学生信息查询模块:根据各种

VC++2005编程问题

问题描述 编写一个单窗口应用程序,要求使用VC++2005,接受RICHEDIT中用户输入的字符,字符中包含以下信息:地点1长度1长度2长度3......地点2长度1长度2.................使用算法处理长度和地点,接受用户输入的两地点名,以字符串形式在另一个RICHEDIT输出两个地点间的最短路径.拟采用结构体数组和字符串搜索来进行实现,但是不熟悉.NET的数据结构,请问要怎样使用ARRAY来实现?怎样判断RICHEDIT的字符流中的一个字符是否是空格,是否是数字及回车换行符号?

MVC进阶学习--个性化目录结构(三)

(一) 目录结构 看到上面的目录结构 会有耳目一新的感觉,终于突破了原有的MVC目录结构.该目录结构除了使用原有的Controllers 文件夹之外,我们还使用了Games自定义文件夹中的Controllers.在Users文件夹中也同样还有一个Controllers文件夹,这些文件夹都是存放控制器类的.我们可以根据自己的需要建立不同的Controller 组. 在大型项目开发的过程中,模块的数量可能会很多,仅仅只靠原有的目录结构是不能满足我们的要求的,而且扩展性也不是太好,因为思想就被束缚在它

MVC进阶学习--个性化目录结构(一)

(一) 简单MVC目录结构分析 以上是一个再简单不过的MVC目录结构了,这也是微软MVC解决方案的基础目录结构,在我们一般的MVC开发项目中,基本上就是套用了这种格式.我们不需要去自己去定义一个目录,因为微软已经帮我们定义好了.我们只需要在原有的基础上添加和修改. Content 文件夹,内容文件夹,姑且这样理解,我们主要存放样式文件,图片文件,xml文件以及其他的一些资源文件.这个没有太多的介绍.当然我们不一定要放到这个里面去,也可以自己定义一个文件夹.不过我个人还是趋向于放在这个里面,毕竟是