转: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)。
 
假设我们期望的目录结构如下图:
 转:VC 2005 解决方案的目录结构设置和管理

 
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)\
 
这样就大功告成了,现在你就可以编译该执行程序并进行调试。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/night_cat/archive/2009/02/11/3876869.aspx

 

注:原文中构建后执行的脚本处,会提示系统找不到指定的文件。

解决方案:

问题解决1: 经过林教头的分析,TOLtech keyboard 文件夹带了空格,可能问题出在这。改成这样子就ok了。 为TargetPath加上引号=》“$(TargetPath)” copy /y “$(TargetPath)” “$(SolutionDir)\Bin\$(ConfigurationName)\;”问题解决2:【摘录】各位兄弟们,那个copy的问题我终于解决了,原来当目标路径的文件夹不存在时,copy命令就不好用了,提示系统找不到指定的路径。,把这句话:
copy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\;
换成以下这句就OK了……
xcopy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\
注意,命令变成了xcopy了,而且最后的分号去掉啦,之后即使Bin目录下没有Debug或Release目录编译器也会自动生成的!~避免下次编译覆盖文件提示加个“/y” 参数,具体修改如下:
xcopy $(TargetPath) $(SolutionDir)\Bin\$(ConfigurationName)\ /y
这回就OK了,如果目标文件正在被使用中的话,会提示“共享侵犯”哦!~

转载于:https://www.cnblogs.com/zhangchenliang/archive/2012/03/08/2385033.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100851.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Laravel5中使用阿里大于(鱼)发送短信验证码

    Laravel5中使用阿里大于(鱼)发送短信验证码

    2021年10月13日
    48
  • Json详解以及fastjson使用教程[通俗易懂]

    Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。在使用Java做Web开发时,不可避免的会遇到Json的使用。下面我们就简单讲一下Json的使用以及fastjson.jar包的使用。一:JSON形式与语法1.1:JSON对象我们先来看以下数据:{ "ID":1001, "name"…

    2022年4月10日
    178
  • S3C2440C语言点灯

    S3C2440C语言点灯第一代程序员使用机器码第二代程序员使用汇编第三代程序员使用C语言C语言相较于汇编和机器码是一个更高级的语言,我们使用的技术也应该与时俱进之前控制寄存器是配置GPFCON和GPFDAT寄存器,通过地址访问,所以可以用C语言来进行对地址的访问。GPFCON——0x5600,0050GPFDAT——0x5600,0054目录S3C2440芯片手册导读用指针表示S3C2440芯片手册导读对于GPFCON,只用到了16位对于GPFDAT,只用到了8位我们仍然可以以32位,就是4字节的

    2022年6月13日
    29
  • ARM方案公司,三星S5PV210核心板,「建议收藏」

    ARM方案公司,三星S5PV210核心板,「建议收藏」核心业务:高通、MTK、三星等解决方案定制开发

    2022年10月14日
    3
  • 交换机与poe交换机区别_网络交换机和poe交换机区别

    交换机与poe交换机区别_网络交换机和poe交换机区别POE(PowerOverEthernet)指的是在目前的以太网接口Cat.5走线系统架构未作其他改变的情形下,在为一些由于IP的终端设备(如IP电话机,无线网络连接点AP,网络摄像头等)传送数据数据信号的与此同时,还能为该类机器设备给予直流电源的技术性.便是适用以太网接口供电的交换机。POE交换机和普通交换机有什么区别呢?关键分成五大层面的不一样:1.可靠性不一样;2.传送功能不一样;3.成本费不一样;4.供电方法不一样;5.操纵不一样。1.可靠性不一样;POE交换机便是适用对网络.

    2022年9月28日
    3
  • Pycharm入门使用教程(for python)「建议收藏」

    Pycharm入门使用教程(for python)「建议收藏」1.新建项目打开2.选择解释器选择了合适自己python代码的解释器,编译才不会出错settings-project-Interpreter-选择合适自己的python3.x或者python2.x3.安装模块settings-project-Interpreter-右边‘+’-选择自己想要安装的模块4.设置字体settings-Appearance&Behaviorsettings-Editor-colorscheme-scheme-选择自己想要的工作区域风格5.设置编码可解

    2022年8月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号