在VS中,存在ATL、MFC、Win32、CLR、常规等等各种工程模板,这些工程模板对应于开发不同类型的应用,比如要开发com,你应该选ATL;开发最原始的通过API代用操作系统的应用,应该用Win32;开发MFC图形界面程序,应该用MFC等等,详细的可以去查资料,比如参考:ATL CLR MFC Win32 常规 的区别

但是我们今天的重点不是这些选项代表什么意思,而是要选择不同模板建立工程之后,当你通过工程的属性面板去配置一些环境如外部保护路径、外部库等等时,不同类型的工程,他的“属性”面板是不一样的。比如你新建工程时选择的是<常规>里的<生成文件目录>的话,你是看不到如图一所示的熟悉的“VC++属性”、“链接器”等等熟悉的界面的,取而代之的是如图二这样的让你不知所以的界面。

图一  通常所见的工程的“属性”面板

图二  选择<常规>里的<生成文件目录>所生成项目的“属性”

何故?别急,这就要设计到一个很重要的文件了,VC的项目工程中,很重要的一个配置文件是一.vcxproj为扩展名的xml配置文件,文件的名字就是工程的名字。你所配置的“属性”就是记录在这个配置文件中的,当然,这个配置文件也包含了你看到的“属性”面板本身长什么样子。其中有一个很重要的配置为ConfigurationType,这就规定了你的是什么类型的项目。请看下面:

   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>

一般来说,我们都是要建立应用程序工程,所以我们看到的就是如图一所示的那种很熟悉的“属性”面板。要出现这样的面板,就需要在.vcxproj文件中配置如上面第2行和第7行的ConfiguratioinType为 Application。为什么要两个位置呢?因为这是对应于不同的编译方案,一个工程可以有多个编译方案,常见的就是Debug和Release,然后又分为Win32和x64(就是分别代表32位和64位,当然也有用x86和x64来代替的)。如果你生成项目时选择的是选择<常规>里的<生成文件目录>所生成项目的“属性”,那么.vcxproj配置文件里的Configuration就不是Application,而是Makefile,你就看到了如图二这样的“属性”面板了。

我们的图一和图二其实是同一个工程,然后我们通过手动更改.vcxproj文件的Configuration,实现了图一到图二的转化。至于为什么会存在这类非Application的工程呢?仔细看图二,有个NMake。这是什么呢?且继续往下看。

我们知道,很多开源库都是在Linux下面写的,因此不可能有VC的编译工程,而是Linux和Unix环境下常用的Makefile工程,而此时要在windows环境下编译,为了方便这类用户的需求,微软搞了一个叫nmake的东西,然后通过写一个类似于Makefile的文件(通常是makefile.vc),再加上一个nmake.opt的配置文件,实现对非VC工程的编译。这类工程照理说只能用命令行操作,但是微软的习惯就是能用鼠标就坚决不用键盘,并且认为用户都不懂命令行的,所以必须在VS这样的IDE中也搞出能够点一下鼠标就能实现Build、Clean这样的操作,所以有了Configuration是MakeFile这样的VC工程类型,让你继续只用鼠标不用键盘地工作。(其实也不是,比如你的makefile.vc就必须自己写,然而,除非你是大神,不然你用到的makefile.vc的时候都是为了用别人写好的库,此时makefile.vc都是别人帮你写好了的)。

VS中为什么不同的项目类型属性查看和设置的界面不一样的更多相关文章

  1. eclipse中怎么调出左边项目列表,解决方法:主界面的最上面一栏的Window--ShowView--Project Explorer

    主界面的最上面一栏的Window--ShowView--Project Explorer

  2. Spring_day01--注入对象类型属性(重点)_P名称空间注入_注入复杂类型属性_IOC和DI区别_Spring整合web项目原理

    注入对象类型属性(重点) Action要new一个service对象,Service中又要new一个Dao对象,现在把new的过程交给spring来操作 1 创建service类和dao类 (1)在s ...

  3. vue项目中使用bpmn-流程图json属性转xml(七篇更新完成)

    内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...

  4. swfit 中的类型属性说明

    swift 中不叫做类属性,叫类型属性,因为在swift中,struct 和enum也是可以有这种属性的,叫类属性明显不准. 有以下注意事项: 对于值类型(指结构体和枚举)可以定义存储型和计算型类型属 ...

  5. C# winform项目中ListView控件使用CheckBoxes属性实现单选功能

    C# winform项目中ListView控件使用CheckBoxes属性实现单选功能 在做项目时需要使用ListView控件的CheckBoxes属性显示,还要在点击行时自动选中CheckBoxes ...

  6. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  7. Swift中的类型属性(静态变量)

    http://blog.haohtml.com/archives/15098 Swift中的类型属性(静态变量) Posted on 2014/06/13 类型属性语法 在 C 或 Objective ...

  8. pojo类对应的就是数据库中的表,pojo类属性类型一定要用包装类Integer等

    pojo类对应的就是数据库中的表,pojo类属性类型一定要用包装类Integer等 pojo类对应的就是数据库中的表,pojo类属性类型一定要用包装类Integer等 pojo类对应的就是数据库中的表 ...

  9. AutoMapper在MVC中的运用06-一次性定义映射、复杂类型属性映射

    本篇AutoMapper使用场景: ※ 当源和目标具有同名的复杂类型属性.集合类型属性,这2种属性对应的类间也需建立映射 ※ 一次性定义好源和目标的所有映射 ※ 一次性定义好源和目标的所有映射,目标中 ...

随机推荐

  1. android canvas中rotate()和translate()两个方法详解

    rotate()和translate() 1.看到这个题目的时候,有人会觉得这不就是一个对画布的旋转和平移的嘛,但是其中的细节的地方还是需要深究一下的. 例如:有个需求将TextView的文字竖直显示 ...

  2. Dynamically loading unmanaged OCX in C#

    You'll have to perform a number of steps that are normally taken of automatically when you use the t ...

  3. Qt绘制简单的风向玫瑰图代码

    1.绘制简单的风向玫瑰图代码2.主要使用QPainter3.在子widget上绘制需要使用widget监视事件 eventfilter update();//更新界面 //镜头12 QPainter ...

  4. Live 直播过程

    采集.处理.编码.封包.推流.传输.转码.分发.拉流.解码.播放,从推流到播放

  5. loj #6013. 「网络流 24 题」负载平衡

    #6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...

  6. P1129 [ZJOI2007]矩阵游戏(二分图,网络流)

    传送门 这推导过程真的有点可怕的说……完全想不出来…… 最终状态是$(1,1),(2,2),(3,3)...(n,n)$都有一个黑点 我们可以理解为每一个行和列都形成了一个匹配 换句话说,只要$n$行 ...

  7. centos7 docker 安装 zookeeper 3.4.13 集群

    假设三台主机的ip分别为: 主机一:192.168.0.168 主机二:192.168.0.169 主机三:192.168.0.170 三台主机的安装步骤相似,以主机一为例: 1. 查找zookeep ...

  8. spark-2.2.1在centos7安装

    前言 在安装Spark之前,我们需要安装Scala语言的支持.在此我选择的是scala-2.11.12版本.jdk8也要保证已经安装好并且配置好环境变量 scala-2.11.12下载 为了方便,我先 ...

  9. python基础之内建函数(二)

    (7)max() 函数:返回列表.元祖或字符串中最大的元素,注意:字母“大于”数字.小写字母“大于”大写字母(字母排序是根据ASCII码表排的) 例如: >>>num = list ...

  10. Linux管理命令

    管理命令 用户管理: useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage 组管理: groupadd, groupdel, ...