在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. C# winform使用cefsharp

    注意事项写在开头: 一)cef要求.Net FrameWork框架最少为4.5.2,所以咱们在创建工程的时候注意 二)cef不支持anycpu平台 第一步: 新建工程  第二步 添加cef nuget ...

  2. 解决在cmder中bash(WSL)上下箭头不能使用问题

    有三种解决方式,第一种方式最简单实用 安装新版本wslbridge 这个解决方法最简单,最实用,下载第三方wslbridge,安装即可使用. 这时再进入cmder,运行bash.exe,可以发现上下左 ...

  3. 个人常用Markdow语法代码备用

    1.分隔线 -------------------------------- 2.OC代码 ``` Objective-C ``` 3.字体加粗 ##加粗## 4.标题样式 <h1> &l ...

  4. Eclipse内存不足 增加eclipse的运行内存

    自己解决的 三.    修改Run Configurations (此方法可行) 在代码上右键,依次点击“Run As ”-> “Run Configurations ”,在Arguments  ...

  5. python之路径拼接urljoin

    方法一:使用+进行路径拼接 url='http://ip/ path='api/user/login' url+path拼接后的路径为'http://ip//api/user/login' 方法二:使 ...

  6. requests利用selenium,代理Ip,云打码,验证码抠图操作 爬取搜狗微信公众号内容

    爬取思路,爬取搜狗微信公众号内容,爬取第一层url时请求太快出现验证码,我这里用的蘑菇云代理,并在程序中我判断什么情况下是否+代理,做到合理运用代理ip.爬取第二层url时验证码出现次数更严重(和第一 ...

  7. Javascript 上传文件到Azure存储

    对一些前端工程师来讲,使用javascript上传文件到Azure存储中可能是需要掌握的技能,希望这篇博客能给到帮助. 在开始前我们需要了解以下几点: 共享访问签名(Shared Access Sig ...

  8. Fast Matrix Operations UVA - 11992 线段树

    题意翻译 有一个r行c列的全0矩阵,有以下三种操作. 1 X1 Y1 X2 Y2 v 子矩阵(X1,Y1,X2,Y2)的元素加v 2 X1 Y1 X2 Y2 v 子矩阵(X1,Y1,X2,Y2)的元素 ...

  9. abp学习资料

    参考: https://www.jianshu.com/p/a6e9ace79345

  10. 167 Two Sum-Input array is sorted, 125 Valid Palindrome,344

    注意这两个元素不能是相同的. 解法一:二分查找法,逐一取数组中的值,然后second = target - numbers[i] , 用二分查找法求第二个值. 时间复杂度:O(nlongn) clas ...