在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. 数组Byte [] 和 string 相互转换

    using System; using System.Collections.Generic; using System.Text; namespace NET.MST.Fourth.StringBy ...

  2. Win7 WPF程序无法接受外部拖拽

    最近在WPF项目中遇到一个问题.虽然选择了AllowDrop = True,但是还是无法支持从外部拖拽文件到程序,倒是内部拖拽(如从一个列表拖拽到树)和从程序拖拽到外部可以. 解决过程 1.考虑是程序 ...

  3. 「POJ 2699」The Maximum Number of Strong Kings

    题目链接 戳我 \(Describe\) 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边\((u, v)\)或\((v, u)\),表示\(u\)打败\(v\)或 ...

  4. 6w4:第六周程序填空题1

    描述 下面程序的输出结果是: A::Fun C::Do 请填空: #include <iostream> using namespace std; class A { private: i ...

  5. vi—终端中的编辑器

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  6. python-flask之request的属性

    flask的request模块的属性(参考) #代码示例,仅仅是为了测试request的属性值 @app.route('/login', methods = ['GET','POST']) def l ...

  7. SHTSC2017酱油记

    考完回来累成狗..睡了一觉..补游记.. DAY0 把最近刷的题发了下题解..NOIP RK10的蒟蒻收拾收拾准备退役了.. 12点就睡了..很久周五没这么早睡了.. DAY1 9点就醒了..莫名紧张 ...

  8. SDUT OJ 数组计算机(线段树)

    学长推荐了这个博客详细的介绍了线段树的建立.查找.更新: 数组计算机 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Prob ...

  9. leetcode-229.求众数(二)

     题目: 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为O(n),空间复杂度为O(1). 示例 1: 输入: [3,2,3] 输出: [3 ...

  10. XAF实现交叉分析

    如何实现如图的交叉分析? In this lesson, you will learn how to add the Analysis functionality to your applicatio ...