寒星轩

There are innumerable stars in the sky, the smallest is me!

用户操作
[即时聊天] [发私信] [加为好友]
李星ID:starlee
208472次访问,排名341好友65人,关注者107
欢迎大家访问我的Blog。
主要是C++,设计模式,面向对象设计方面的技术文章。
starlee的文章
原创 98 篇
翻译 0 篇
转载 45 篇
评论 332 篇
李星的公告
郑重声明

        本BLOG所发表的 原创文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者(StarLee)和出处(CSDN Blog)。
作者Email:
coolstarlee(at)sohu.com
最近评论
三月鸟:漫游太空2001是值得看最多次,看懂以后能感觉出最多的片子。。
就说千与千寻,我觉得比那些皮克斯的强不知道多少。。。。
喜欢千与千寻和天空之城。。。
陈诚:好象不一样,我这个共两个类,实现类和接口类
深夜才走在路上:实际上使用CLR封送C++类让人很受伤,在mc中有很多C++的特性不能使用,甚至STL都不可用
hfg :错了错了,当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

不管基类的析构函数是不是virtual ,派生类的析构函数还是会被调用的,区别只是在于基类的析构函数有没有被调用
Forrest Yu:Star Lee:

如果有两个以上的类需要包装,那又应该怎样做呢?
文章分类
收藏
相册
友情链接
houdy的专栏
lijgame的专栏
lyrebing的专栏
禾青谷
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 一步一步创建VC2005解决方案收藏

新一篇: 用枚举定义有意义的数组下标 | 旧一篇: 大师也犯低级错误--《CODE COMPLETE (Second Edition)》中的2处代码错误

    现在软件开发已经告别了“独行侠”的年代,而是以团队开发为主。一般情况下,一个解决方案都会包含多个项目,比如:其中一些是静态库项目,一些是动态库项目,当然还会有应用程序项目。另外,根据需要,还可能会使用一些第三方库。因此为解决方案设置一个合理的目录结构并配合一定的环境变量,不但可以使得代码管理更井井有条,项目成员之间也更容易相互配合,更重要的是能够使得最终应用程序的安装包制作,源代码打包发布和转移变得十分容易。

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

    下面就以一个例子来说明怎样一步一步的创建一个VC2005解决方案。
    比如该方案名为StepByStep。里面共有3个工程:应用程序工程EXE,静态库工程LIB,和动态库工程DLL。另外还要用到第三方的库。

    第一步,为解决方案设计目录结构


   

    1. SetpBySetp是解决方案目录
    2. Bin是存放最终可发布的生成文件的文件夹
    3. Config文件夹内存放配置文件
    4. Lib内是存放所有的.lib文件(lib文件夹内)和使用库文件所需的头文件(inc文件夹内)
    5. Source内是所有工程的源代码
    6. Temp是临时文件夹,存放中间文件(Intermediate)和输出文件(Output文件夹)

    第二步,为解决方案编写启动批处理文件(.bat)

@echo off

rem -- This .bat file is used to start the solution

rem -- These variables can be changed as you need
set VIRTUALDIRVE
=S:
set REALPATH
=D:\StarLee

@echo Create the virtual dirve ...

if not exist %VIRTUALDIRVE% subst %VIRTUALDIRVE% %REALPATH%

@echo -- Success!
@echo.
@echo Set develop environment variables ...

set SOLUTIONNAME
=StepByStep
set ROOT
=%VIRTUALDIRVE%\%SOLUTIONNAME%
set BIN
=%ROOT%\Bin
set CONFIG
=%ROOT%\Config
set LIB
=%ROOT%\Liblib
set SOURCE
=%ROOT%\Source
set TEMP
=%ROOT%\Temp
set OUTPUT
=%TEMP%\Output
set INTERMEDIATE
=%TEMP%\Intermediate

@echo -- Success!
@echo.
@echo Open solution in VS.Net IDE ...

if not exist %SOURCE%\%SOLUTIONNAME%.sln goto ERROR_NOT_FOUND_SOLUTION_FILE
devenv %SOURCE%\%SOLUTIONNAME%.sln

@echo -- Success!

goto END

:ERROR_NOT_FOUND_SOLUTION_FILE
@echo ERROR: Not found the solution file!
goto END

:END

    可以将该批处理文件放在解决方案根目录下。
    该批处理文件分为3个部分:
    1. 设置虚拟盘
    文件中是把D:\StarLee设置成了虚拟盘S:,这样做的好处是可以方便的访问解决方案中的各个文件,便于管理。
    背景资料:subst命令可以将一个目录设置为一个虚拟盘。详细信息可以参照subst的帮助信息。
    2. 设置环境变量
    在这里设置的环境变量会在工程的属性设置中用到。
    3. 启动解决方案
    调用VS的devenv来在VS的IDE里面打开解决方案。
   
    使用方法:
    在开始菜单中打开“Microsoft Visual Studio 2005”,选择“Visual Studio Tools”,点击“Visual Studio 2005 Command Prompt”,然后在弹出的Command窗口中执行该批处理文件,就可以直接在VS的IDE里面打开解决方案。

    在软件开发的时候,一般都会使用版本控制程序(如VSS,Perforce等)来对源代码进行管理,代码以及目录结构都会存放在服务器上。如果目录结构需要改变,那么针对每个客户端上的开发者来说,重新构建开发目录结构是一个很麻烦的事情。而有了上面这个批处理文件,一切都变的容易了,只要修改这个批处理文件中的环境变量就行了。每个开发人员都可以根据自己的情况来修改文件中第一部分的VIRTUALDIRVE和REALPATH,再加上后面两步中的方法,就可以避免重新构建开发目录。

    第三步,为解决方案创建一个Project Property Sheet
    1. 在VS的IDE菜单中选择“View”,然后选择“Property Manager”。
    2. 在Property Manager中用向导创建一个Project Property Sheet。将创建出的Project Propery Sheet存放在Config文件夹内(本例中该文件为StepByStep.vsprops)。


   

    3. 编辑“Gerneral”选项页中的“Output Directory”和“Intermediate Directory”属性。分别输入$(OUTPUT)和$(INTERMEDIATE)


   

    4. 编辑“Post-Build Event”选项页中的“Command Line”属性。输入下面的命令:
copy $(OUTPUT)\*.dll $(BIN)
copy $(OUTPUT)\*.exe $(BIN)
copy $(OUTPUT)\*.lib $(LIB)


   

    5. 保存Project Property Sheet。

    这里用到了在第二步中的批处理文件里面创建的环境变量。如果目录结构改变,只要修改批处理文件即可,不需要修改项目文件。

    Project Property Sheet其实就是一个项目属性模板。
    一个解决方案中的各个项目的属性设置中有很多都是相同的,可以把这些相同的属性都存放在一个Project Property Sheet里,然后让每个项目中这些相同的属性继承自这个Project Property Sheet。那样当这些相同的属性需要改变的时候,只要改变Project Property Sheet文件就行了,而不用一个一个项目的改变。而且,一个Project Property Sheet还可以从另外一个Project Property Sheet继承。这跟面向对象中类的继承是一样的。
    其实,Project Property Sheet对应的.vsprops就是一个XML文件。本例中StepByStep.vsprops文件的内容如下:

<?xml version="1.0" encoding="gb2312"?>
<VisualStudioPropertySheet
    
ProjectType="Visual C++"
    Version
="8.00"
    Name
="StepByStep"
    OutputDirectory
="$(OUTPUT)"
    IntermediateDirectory
="$(INTERMEDIATE)"
    
>
    
<Tool
        
Name="VCPostBuildEventTool"
        CommandLine
="copy $(OUTPUT)*.dll $(BIN)&#x0D;&#x0A;copy $(OUTPUT)*.exe $(BIN)&#x0D;&#x0A;copy $(OUTPUT)*.lib $(LIB)&#x0D;&#x0A;"
    
/>
</VisualStudioPropertySheet>

    第四步,让解决方案中的各个项目属性从Project Property Sheet继承
    1. 打开项目的属性页,将“Configuration”改为“All Configurations”,以使属性的修改对所有配置都有效。在“Inherited Project Property Sheet”中输入$(CONFIG)\StepByStep.vsprops


   

    2. 选择要从Project Property Sheet继承的属性,在下拉框中选择“<inherit from parent or project defaults>”,然后点击“Apply”按钮就行了。

    通过上面四步,就创建了一个完整的,有合理目录的,非常便于管理的VC2005解决方案。在需要发布的时候,只要在Release配置下进行编译,然后将Bin文件夹内的文件打包即可。
    其实,上面的例子只是一个很小的解决方案。在一些中型或者大型的软件开发过程中,解决方案肯定比这个要庞大很多,相关的目录结构和配置也会复杂很多,那样就更能体现出上面的方法和步骤的优点。 

发表于 @ 2007年09月03日 08:51:00|评论(loading...)|编辑

新一篇: 用枚举定义有意义的数组下标 | 旧一篇: 大师也犯低级错误--《CODE COMPLETE (Second Edition)》中的2处代码错误

评论

#program_net 发表于2007-09-03 13:30:04  IP: 60.178.241.*
讲的不错
#sunicdavy 发表于2007-09-03 21:34:21  IP: 221.221.13.*
非常感谢,太有用了
#vv 发表于2007-09-04 08:37:47  IP: 124.193.148.*
4. 编辑“Post-Build Event”选项页中的“Command Line”属性。输入下面的命令:
copy $(OUTPUT)\*.dll $(BIN)
copy $(OUTPUT)\*.exe $(BIN)
copy $(OUTPUT)\*.lib $(LIB)

用这种方式来生成dll,lib,exe等文件,就不支持edit&continue了。干嘛不直接输出到 $(BIN),$(LIB)等目录下。
2007-09-04 08:44:41作者回复
文章中第三步中第3小步可以看到输出目录是$(OUTPUT)。“Post-Build Event”中的命令只是将这些文件拷贝到用来打包发布的文件夹。
#youngboyxp 发表于2007-09-04 09:39:17  IP: 222.90.170.*
非常实用
一般工程搭建都不太在意,会造成很多不便和问题。
#fantimond 发表于2007-09-05 08:50:54  IP: 221.221.27.*
讲得很好。以前用vs2005总觉得不习惯,原来还是自己没有从vc6中走出来呀。
#jsjwql 发表于2007-09-07 16:58:48  IP: 218.83.157.*
set SOLUTIONNAME=StepByStep
set ROOT=%VIRTUALDIRVE%\%SOLUTIONNAME%
set BIN=%ROOT%\Bin
set CONFIG=%ROOT%\Config
set LIB=%ROOT%\Liblib
set SOURCE=%ROOT%\Source
set TEMP=%ROOT%\Temp
set OUTPUT=%TEMP%\Output
set INTERMEDIATE=%TEMP%\Intermediate

你提到“ 在这里设置的环境变量会在工程的属性设置中用到。”,请问怎么实践?
#jsjwql 发表于2007-09-07 17:11:57  IP: 218.83.157.*
1.我看到你后面用到了$(OUTPUT)和$(INTERMEDIATE),是不是前面定义的? 如果定义了这些环境变量,它们会不会被加到
“Macros<<"里面去?
2.在perforce上面改目录结构确实是非常麻烦的事情,我对”而有了上面这个批处理文件,一切都变的容易了,只要修改这个批处理文件中的环境变量就行了“理解不是很深,上面第一张图描述的目录结构好变吗,比如说把lib文件夹放到source里面去

3. 不太清楚output用到temp里面起什么作用,每次编译结束不都拷贝到bin下面去了吗,这样会影响速度?

这篇文章确实很好,实践性很强,所以我想了比较多,请赐教?:)
2007-09-07 20:20:27作者回复
1、$(OUTPUT)和$(INTERMEDIATE)就是前面定义的。它们不会被加到“Macros”里面去。 2、这里的意思是修改目录结构后,只要修改批处理文件就行了,对VC解决方案来说不用做任何修改。 3、编译后的输出文件都会输出到根目录下的\Temp\Output\下,而Bin文件夹是用来存放将来用来打包发布的文件的。其实可以在最后需要发布的时候再拷贝,但是如果目录结构比较复杂的话,找到每个文件就会比较麻烦。这样虽然每次编译都要拷贝,看起来没有什么用,但是却给最后的发布带来了很大的方便。再说了,比较大的解决方案中开发过程和功能测试都是同时进行的,每次功能测试的时候只需要Bin文件夹下的文件就行了。
#badguy2002 发表于2007-11-08 15:59:36  IP: 202.95.81.*
请问lz,vs项目的宏应该在哪里设置呢,我指是是在Build event中点击"Macros<<"按钮显示的一系列环境变量,请问在哪里可以设置或者说增加它们呢,我找了半天没有找到。不知道是不是在step3图片中的User Macros中设置?但是我在我的vs中找到半天好像没有这项,谢谢了
2007-11-08 17:04:42作者回复
这些宏是由VS自己生成的。如果要想增加,可以用上面文章中的方法在批处理中添加环境变量,然后用这些环境变量来修改相应的工程属性。
#badguy2002 发表于2007-11-09 17:22:49  IP: 202.95.81.*
谢谢lz,还有一个问题请教一下,我现在调试一个dll,需要指定一个启动应用程序,但是由于启动之前需要设置一些环境变量,所以是用一个.bat文件完成的(bat的内容就是首先设置环境变量,然后启动exe程序)。但是发现vs里面指定的启动程序必须是.exe,那这种情况下如何解决?难道必须把这些环境变量加到系统里面么?
2007-11-10 10:55:09作者回复
你所说的这些环境变量可以添加在第二步中所说的批处理文件里面。按照第二步的使用方法执行的话,会有一个Command窗口,执行完上面的批处理后,可以在这个窗口里面启动你的exe程序。那样就可以解决你的问题了。
#yang 发表于2008-04-08 11:55:51  IP: 221.221.55.*
你好,能不能在具体介绍一下文中的批处理文件怎么用?因为用您介绍的方法,无法执行这个批处理文件.
谢谢!
#yang 发表于2008-04-08 14:33:13  IP: 221.221.55.*
呵呵,是我把文件后缀写错了,难怪不能运行!
#yang 发表于2008-04-09 11:22:34  IP: 221.221.54.*
想再请教一下:文中的"解决方案的设计目录结构"中的文件夹是否对应物理存储中的文件夹?
2008-04-09 20:10:17作者回复
那张截图就是我硬盘上的文件目录结构。这里只是举个例子,具体的目录结构可以根据项目需求来设计。
#cheungchiang 发表于2008-06-07 10:58:11  IP: 218.7.43.*
谢谢,楼主赐教,太实用了
#tecancy 发表于2008-08-31 18:32:08  IP: 58.33.2.*
Open solution in VS.Net IDE ...
ERROR: Not found the solution file!

请问楼主,命令行出项上面提示,不能打开解决方案,怎么解决
谢谢
2008-08-31 18:47:12作者回复
你是按照文章中的详细步骤做的么?
你就给个错误信息,没有前后文,我怎么帮你找到问题呀?
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 李星