[转]VisualStudio如何组织解决方案的目录结构

***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

***************************************************


解决方案与项目:

VC6之后VC系列就使用解决方案Solution)来替代原来的工作空间,用于组织和管理多个相关的项目(Project
文章首先演示一个虚拟的解决方案和我们期望得到的目录结构,然后使用VC2008的项目设置功能来一步一步达到我们的需求。

虚拟解决方案:
该虚拟解决方案名为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 2008并不会自动为我们做好上面所有的事情。不过我们并不需要编写复杂的编译脚本(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)\
这样就大功告成了,现在你就可以编译该执行程序并进行调试。

备注:此文不是适合所有项目,不过利用Visual Studio里面的宏定义和生成事件确实可以更好的组织项目目录结构,转载以备查阅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java几种删除_几种删除Linux目录的方法

在Linux中有很多方法可以删除目录,在图形化界面可以利用文件管理器,或者通过终端删除。本文将介绍在文本界面使用命令删除目录。使用rmdir删除目录Rmdir命令间成“remove directory”,用于删除空目录的命令。例如,删除一个名为“M…

php公钥模数,php – 如何从公共指数和RSA模数生成DER / PEM证书?

众所周知,公钥由公共指数和模数组成.我的问题是:如何从公共指数和RSA模数生成DER / PEM证书?非常感谢你提前.解决方法:使用公共指数和模数,你可能希望做的最好的事情是得到这样的东西:-----BEGIN PUBLIC KEY-----MIGGAoGAfHlcdrcuOK6C02rbGR3…

C# DataTable的詳細用法

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** DataTable 是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。DataTable是A…

【SpringMVC】SpringMVC系列6之@CookieValue 映射请求Cookie 值

6、CookieValue 映射请求Cookie 值 6.1、示例 CookieValue 可让处理方法入参绑定某个 Cookie 值,示例如下:

杭电OJ-2104_hide handkerchief超简洁代码

#include<iostream> using namespace std; int n, m;; int zz(int a, int b) {return b0 ? a: zz(b, a%b); } int main() {while (cin >> n >> m&&n ! -1 && m ! -1)cout << (nb(n, m) 1 ? "YES" : "POOR Haha"…

php 年月日 中文,转换中文日期的PHP程序

转换中文日期的PHP程序本程序将中文日期输出为2001-12-23&#xff0c;并很好解决了“十”的问题&#xff0c;如“十一”和“二十一”中“十”的处理&#xff01;稍加修改可改为函数。跟随小编去看看吧&#xff01;希望对大家有所帮助&#xff01;$str"二零○一年十二月二十…

c# Invoke和BeginInvoke

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 转自&#xff1a;http://blog.3snews.net/html/30/34530-27563.html在多线程编程中&am…

Oracle手边常用70则脚本知识汇总

Oracle手边常用70则脚本知识汇总 作者&#xff1a;白宁超 时间&#xff1a;2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中&#xff0c;常用脚本命令莫不是用户和密码、表空间、多表联合、执行语句等常规操作。另外表的导入导出也很常用&#xff0c;这些脚步命令之前都…

php常见的面试题目

一. 基本知识点1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。200 : 请求成功&#xff0c;请求的数据随之返回。301 : 永久性重定向。302 : 暂时行重定向。401 : 当前请求需要用户验证。403 : 服务器拒绝执行请求&#xff0c;即没有权限。404 : 请求失…

php表示私有变量的是,PHP 访问私有和受保护的成员变量

示例反射通常用作软件测试的一部分&#xff0c;例如在运行时创建/实例化模拟对象。这对于在任何给定时间点检查对象的状态也非常有用。这是在单元测试中使用Reflection来验证受保护的类成员是否包含期望值的示例。下面是一个非常基础的汽车课。它具有受保护的成员变量&#xff…

BZOJ2683 简单题(CDQ分治)

传送门 之前听别人说CDQ分治不难学&#xff0c;今天才知道果真如此。之前一直为自己想不到CDQ的方法二很不爽&#xff0c;今天终于是想出来了一道了&#xff0c;太弱…… cdq分治主要就是把整段区间分成两半&#xff0c;然后用左区间的值去更新右区间的答案&#xff0c;每次把…

VS2010断点设置技巧

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 许多Visual Studio下的程序员&#xff0c;甚至一些很有经验的开发人员&#xff0c;都不…

IOS应用开发版本控制工具之Versions使用,iosversions

Versions版本控制工具破解版&#xff08;Versions.zip&#xff09;下载请见本博文附件。下载后在MAC安装完以后&#xff0c;图标是莲花状。见下图&#xff1a; 双击运行如下图&#xff1a; 点击Repository&#xff0c;连接SVN服务器Repository&#xff08;服务器端采用的是SVN服…

php form action跳转,form表单页面跳转方式提交练习

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//form表单提交练习/*新建一个form.html网页用来书写前端HTML表单*/表单提交练习姓名:年龄:电话:地址:QQ:自我评价://以上功能可自己添加或修改/*在form.html网页的基础上新建一个foms.php网页关联之前的form.html网页并书写php测试…

VS2010调试快捷键

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** vs2010 调试快捷键 命令名 快捷键 说明 调试.应用代码更改 Alt F10 启动生…

什么是算法,什么是数据结构

尽管已经学了几年&#xff0c;对它们也可以说大致懂得。但是&#xff0c;作为非计算机专业的人员&#xff0c;还是不会比计算机专业人员懂得多。既然没有受过专门的学习训练&#xff0c;自然会有三天打鱼两天晒网的感觉&#xff0c;一天可能冒出一个念头。于是乎&#xff0c;写…

如何在多web服务器共享SESSION数据

2019独角兽企业重金招聘Python工程师标准>>> 一、问题起源 稍大一些的网站&#xff0c;通常都会有好几个服务器&#xff0c;每个服务器运行着不同功能的模块&#xff0c;使用不同的二级域名&#xff0c;而一个整体性强的网站&#xff0c;用户系统是统一的&#xff0…

grpc php 返回值过大,使用grpc实现php、java、go三方互调

grpc作为经典的rpc协议&#xff0c;虽然略重&#xff0c;但是是有学习的价值的通过下面的内容可以快速上手这个grpc框架安装命令行工具php需要这个额外的protoc、grpc_php_plugin工具把这个protobuf格式的文件生成php语言里的类go需要安装protoc-gen-go工具把protobuf格式的接口…

SOCKET通信的基本步骤

SOCKET通信的基本步骤 1&#xff09;建立一个服务器ServerSocket&#xff0c;并同时定义好ServerSocket的监听端口&#xff1b;2&#xff09;ServerSocket 调用accept()方法&#xff0c;使之处于阻塞。3&#xff09;创建一个客户机Socket,并设置好服务器的IP和端口。4&#xff…

Linux epoll 笔记(高并发事件处理机制)

wiki&#xff1a; Epoll优点&#xff1b; Epoll工作流程&#xff1b; Epoll实现机制: epollevent; Epoll源码分析&#xff1b; Epoll接口: epoll_create; epoll_ctl; epoll_close; Epoll工作方式: LT(level-triggered); ET(edge-triggered); Epoll应用模式; Epoll优点&#xff…