当前位置: 首页 > news >正文

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

相关文章:

  • ldr和adr在使用标号表达式作为操作数的区别
  • 快速搭建YUM源和yum使用
  • 添加菜单的窗口
  • NodeJS+Node Inspector简单使用
  • 修复libjson不支持utf8格式字符
  • 表空间在dba_tablespaces中存在,删除时却提示无法删除
  • MyEclipse 安装aptana插件
  • DZ论坛如何去掉“今日”“昨日”发帖数显示?
  • PHP+MYSQL 出现乱码的解决方法
  • mysql 按距离今日时间最近排序
  • Ruby小例子
  • MySQL安装方法及简单配置
  • 【好文翻译】码农们:效率与质量,你选择哪个?
  • [转]div 让文字或图片居中
  • 程序员能力矩阵 Programmer Competency Matrix
  • 【React系列】如何构建React应用程序
  • 2018一半小结一波
  • AngularJS指令开发(1)——参数详解
  • HTTP中的ETag在移动客户端的应用
  • Javascript基础之Array数组API
  • Magento 1.x 中文订单打印乱码
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring security oauth2 password授权模式
  • V4L2视频输入框架概述
  • v-if和v-for连用出现的问题
  • XML已死 ?
  • - 概述 - 《设计模式(极简c++版)》
  • 基于webpack 的 vue 多页架构
  • 简单易用的leetcode开发测试工具(npm)
  • 面试遇到的一些题
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微信支付JSAPI,实测!终极方案
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 在Docker Swarm上部署Apache Storm:第1部分
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 昨天1024程序员节,我故意写了个死循环~
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #git 撤消对文件的更改
  • #HarmonyOS:基础语法
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (¥1011)-(一千零一拾一元整)输出
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (done) 两个矩阵 “相似” 是什么意思?
  • (LeetCode C++)盛最多水的容器
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四)c52学习之旅-流水LED灯
  • (一一四)第九章编程练习
  • (原創) 系統分析和系統設計有什麼差別? (OO)