说惯了面向硬件的操作系统,也应该说说操作系统的主要使用对象–用户程序。要深入理解程序的运作过程,则需要了解编译原理、链接、装载和运行库等知识。一般都是IDE封装了这些过程,一个简单的Shift+F5指令封装了“预编译+编译+汇编+链接+装载”全过程,而要想分割独立地控制或挖掘这些子过程,则不得不借助一些工具,如预编译编译程序cl、汇编器as、链接器link、查看工具dumpbin(针对Windows PE文件结构)、binutils工具套件(配合gcc针对ELF文件结构)等。

利用编译器可以深度控制你自己的代码,并且可以比IDE编译更快,当然付出的代价便是你某种程度上需要事必躬亲,而不像使用IDE那么一键速成。

首先如果你想要在你的windows电脑上使用cl编译器,你首先得把cl编译器的环境变量给设置一下,否则你的命令行将会显示没有这样的启动项或命令。

PATH = **YourVS-install-place**\VC\bin
INCLUDE = **YourVS-install-place**\VC\include
LIB = **YourVS-install-place**\VC\lib

如果提示找不到mspdb80.dll,则需要手动从VC\Common7\IDE下拷贝“msobj80.dll\mspdb80.dll\mspdbcore.dll\mspdbsrv.exe”到VC\bin下即可。

/*CL命令格式*/
CL [option...] file... [option | file] ...[lib] [@command-file] [/link link-opt]
cl [选项...] 文件名...[/link链接选项...]
/*
1. option: 参数选项可以使用“/”或“-”修饰给出具体含义可使用>cl /help option展示*********. c/c++ 编译器选项 ---优化----*************/O1     最小化空间,使得产生的可执行代码最小                   /O2     最大化速度,使得优化后的可执行代码运行最快/Od     禁用优化选项(编译起default)/Og     启用全局优化                   /Oi[-]  启用内部函数,用内部函数去代替程序里的函数调用,可以使程序加速,但是程序长度增加/Os     偏向于代码空间优化              /Ot     偏向于代码速度优化/Ox     组合了几个优化开关,最大化优化                     /Oy     阻止调用堆栈里,创建帧指针(仅x86)/favor  对于特定架构平台的优化/favor:[blend/ATOM/AMD64/INTEL64]***********************************************************. c/c++ 编译器选项 ---代码生成----*************1. /arch:<SSE | SSE2 | AUX> CPU架构的最低要求,以下为选项信息
    SSE - 启用支持SSE的CPU可用的指令
    SSE2(https://baike.baidu.com/item/SSE2/1190211?fr=aladdin) - 启用支持SSE2的CPU可用的指令
    AUX  - 支持使用Intel(R)高级矢量扩展指令2. /GA           对windows应用程序进行优化3. /Gd           采用__cdecl调用惯例4. /GD           为Windows动态库DLL做优化,此功能在VC6之前并没有5. /Ge           对所有函数强制堆栈检查6. /GF           消除程序中的重复的字符串,并启用只读字符串池,将该字符串放入只读的缓冲区中7. /Gf           消除程序中的重复字符串8. /Gh           在每个函数的开头调用钩子函数_penter9. /GH           在每个函数的末尾启用钩子函数_pexit10. /GL          启用链接时代码生成,打开整个程序优化 11. /Gm[-]       启用最小重新生成rebuild12. /GR          打开C++ 运行时类型信息RTTI(RunTime Type Information)13. /Gr          采用__fastcall 调用规定14. /GS          检查缓冲区安全检查15. /Gs[num]     控制堆栈检测所用的内存大小16. /GT          使用TLS(thread Local storage)静态线程本地存储时保证数据分配安全,
                //支持用_declspec(thread)分配的数据的fier-safety17. /Gv          使用__vectorcall调用惯例18. /Gw          打开整个程序的全局数据优化19. /GX          打开同步异常处理,与/EHsc开关等价20. /Gy[-]       分隔链接器函数,打开函数级链接21. /GZ          启用堆栈检查(/RTCs)22. /Gz          使用__stdcall调用惯例23. /clr[:option] 产生运行在the common language runtime上的输出文件,其中option是:
                   pure--生成只包含IL的输出文件
                   safe--生成只包含IL的可验证输出文件
                   oldSyntax--接受VC++ 2002/2003的托管扩展语法
                   initialAppDomain--启用VC++ 2002的初始AppDomain行为
                   noAssembly--不产生程序集24./hotpatch     确保可热修补映射的函数填充,创建一个补丁镜像25./QIfist       禁止浮点数转换为整数时调用_fotl(),而使用FIST26./Qimprecise_fwaits  在try块内部移除FWAITs指令,而仅在try边界生成27./Qsafe_fp_loads     生成安全FP负载28./EHs           启用C++ EH(没有SEH异常)29./EHa           启用C++ EH(w/ SEH异常)30./EHc           外部“C”默认为nothrow31./RTC1          启用快速检查32./RTCc          转换为较小的类型检查33./RTCs          堆栈帧运行时检查34./RTCu          未初始化的局部用法检查/*感觉除了几个调用惯例设置和钩子函数的设置外,其他选项基本上用不到*/************************************************************************. c/c++ 编译器选项 ---输出文件----*************1./doc[file]  处理注释文档到一个XML文件2./Fa[file]   创建汇编列表文件,指定用/FA设置的列表文件的存放路径及(或)文件名3./FA         配置汇编列表文件,设置生成何种列表文件(汇编、汇编与机器码、汇编与源码、汇编与机器码以及源码)4./Fd[file]   命名.PDB文件5./Fe<file>   命名可执行文件6./Fm[file]   创建mapfile映射文件7./Fo<file>   命名对象.obj文件8./Fp<file>   指定预编译头文件9./Fr[file]   命名源浏览器文件10./Fi[file]  指定预处理输出的文件名************************************************************************. c/c++ 编译器选项 ---预处理器----*************1./AI<dir>         Specifies a directory to search to resolve file references passed to the #using directive.添加到程序集搜索路径
2./C                    Preserves comments during preprocessing.不抽出注释
3./D<name>{=|#}<text>   定义宏,与源程序中#define效果相同
4./E                    复制预处理到标准输出
5./EP                   复制预处理到标准输出,无行号
6./P                    写预处理到一个输出文件,文件的后缀名为I
7./FI<file>         预处理指定的include文件
8./Fx                   合并注入代码和源代码,将插入的代码合并到文件中
9./I<dir>                   指定include文件搜索路径
10./U                   删除预定义宏
11./u                   和/U相同
12./X                   忽略标准include路径,阻止编译器搜索标准的include目录
13./Yc[file]            创建预编译头文件(.pch)
14./Yd                  在所有的obj文件里写上完全的调试信息,将调试信息放在每个.obj文件中
15./Yu[file]            在build过程中使用指定的预编译头文件
16./YX                 指示编译器若预编译头文件存在,则使用它,若不存在,则创建一个************************************************************************. c/c++ 编译器选项 --语言相关----*************
/openmp     启用OpenMP 2.0语言扩展,打开#pragma omp在源代码中
/vd     禁止或者打开隐藏vtordisp类的成员(构造函数置换)
/vmb        选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,必须先定义这个类,Uses best base for pointers to members.
/vmg        选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,不必先定义这个类,但是要指定这个类是使用何种继承方法,Uses full generality for pointers to members.
/vmm        设置指针的表示方法为多继承
/vms        设置指针的表示方法为单继承
/vmv        设置指针的表示方法为虚拟继承Any class
/Z7         产生和C 7.0兼容的调试信息
/Za         禁用语音扩展(微软编译器对C的扩展Micrsoft Extension to C)
/Zc         指定一个标准行为在/Ze下
/Zd         调试信息只包含外部和全局的符号信息以及行号信息
/Ze         允许语言扩展(Micrsoft Extension to C)
/Zg         产生函数原型,为源文件里面定义的每个函数生成函数原型
/ZI         生成程序库文件(.Pdb),并支持Edit and Continue调试特性,在程序数据库中包括调试信息(仅x86)
/Zi         生成程序库文件(.Pdb),产生完整的调试信息,启用调试信息
/Zl         从.obj文件中删除默认的库名
/Zp[n]      在n字节边界上包装结构,设置结构成员在内存里面的封装格式
/Zs         快速检查语法错误
/ZW         产生一个输出文件能运行在windows运行环境************************************************************************. c/c++ 编译器选项 ---链接----*************
/F<num>     设置堆栈尺寸
/LD         创建动态链接库
/LDd        创建一个调试动态链接库含有debug信息
/link       将指定的参数选项传递各链接器
/LN         创建.netmodule,创建一个MSIL模型
/MD         编译创建一个多线程 DLL,使用msvcrt.lib
/MDd        编译创建一个调试多线程 DLL,Debug版本,使用msvcrtd.lib
/MT         编译创建一个多线程执行程序,使用libcmt.lib
/MTd        编译场景一个调试多线程执行程序,Debug版本,使用libcmtd.lib************************************************************************. c/c++ 编译器选项 ---杂项----*************
/?              列出编译选项
@<file>         指定一个响应文件
/analyze        打开代码分析
/bigobj         生成扩展的对象格式
/c              编译但不链接,即只生成.obj文件
/errorReport<option>        打开在vc++终端中提供内部编译错误信息(ICE)
/FC             显示传递给cl.exe的源代码的完整路径到一个文件中
/FS             强制写入一个程序数据库文件(PDB)
/H<n>           限制外部名字的长度,最大外部名称长度
/HELP           列出编译选项
/J              改变默认char类型,从signed char改成unsigned char
/kernel         编译器和链接器将创建一个可以在windows内核中执行的执行程序
/MP[n]          同时建造多源代码文件,最多使用n个进行编译
/nologo         禁止显示启动版权标志,取消显示版权信息
/sdl            打开一些附加的安全功能和警告
/showIncludes   在编译期间显示全部include文件的列表/TC             将所有文件看做C源程序编译,不管后缀名是否为.c
/Tc             将指定的文件当作C源程序编译,不管后缀名是否为.c
/TP             将所有文件看做C++源程序编译,不管后缀名是否为.cpp
/Tp             将指定文件当作C++源程序编译,不管后缀名是否为.cpp/V              版本信息
/Y              禁用所有PCH选项/Wall           打开全部警告,包括默认关闭的警告
/w              关闭全部警告
/wd<n>          禁用警告n
/we<n>          将警告n视为错误
/wo<n>          将警告n发出一次
/w<l><n>        将警告n设置警告等级1-4
/W<n>           设置警告等级(默认n=1)
/WL             打开在用命令行编译C++源代码时使用一行显示错误和警告信息,启用单行诊断
/WX             将警告视为错误
/Wp64           侦测可能的64-bit问题,启用64位端口定位警告/Yd         在对象文件中放置完整的调试信息
/Yl         当创建一个调试库时植入PCH引用
/Zm<n>      最大内存分配,默认为百分数%***************************************************************
*/ 

vc所支持的文件类型

1) DSW:全称是Developer Studio Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,是一个纯文本的文件,在vc创建新项目的时候自动生成
2) DSP:全称是Developer Studio Project,也是一个配置文件,不过记录的是一个项目的所有配置信息,纯文本文件,相当于manifest文件
3) OPT:与DSW、DSP配合使用的配置文件,记录了与机器硬件有关的信息,同一个项目在不同的机器上的opt文件内容是不同的

4) CLW:记录了跟ClassWizard相关的信息,如果丢失了clw文件,那么在Class View面板里就没有类信息
5) PLG:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程,是一个日志型文件

6) RC:资源描述文件,记录了所有的资源信息,在资源编辑器里作的修改,实际上都是对RC文件的修改
7) RC2:附加的资源描述文件,不能直接资源编辑器修改,只能手工添加,可以用来添加额外的资源
8) RES:经过资源编辑器编译之后的资源文件,以二进制方式存放

9) SBR:编译器生成的浏览信息文件,在代码导航的时候非常有用,她需要在编译时指定/FR或者/Fr开关
10) BSC:BSCMAKE.EXE将所有的SBR文件作为输入,经过处理之后输出一个BSC文件,在代码导航的时候实际用到的是BSC文件

11) ILK:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息
12) PDB:全称是Program DataBase,即程序数据库文件,用来记录调试信息,是一个相当重要的文件,没有该文件则程序无法正常调试

13) LIB:如果项目输出是Dll的话,一般会输出一个跟项目同名的Lib文件,记录输出的函数信息,俗称胶水代码,一般在link时,可以使用同名.lib,用来指向具体实现的.dll文件
14) EXP:同Lib,是跟Dll一起生成的输出文件

15) PCH:全称是PreCompiled Header,就是预先编译好的头文件,在编译时指定/Yu开关时编译器自动生成

程序底层工具:cl编译器相关推荐

  1. 【网络通信】简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用

    简易MFC程序的创建与命令行工具cl.exe.linker.exe的使用 实验目标 实验流程 一.MFC程序 1.创建MFC项目 2.资源与代码 3.演示效果 二.编译连接windows API程序 ...

  2. 使用ultraedit和cl编译器打造简易c/c++开发环境

    在visual c++下,每编写一个简单的小程序,就得生成一大串中间文件,另人十分的不爽.下面提供一个新的编写c/c++程序的方法: (1),下载utraledit-32编辑器,推荐v11. (2), ...

  3. 程序分析工具gprof介绍

    程序分析是以某种语言书写的程序为对象,对其内部的运作流程进行分析.程序分析的目的主要有三点:一是通过程序内部各个模块之间的调用关系,整体上把握程序的运行流程,从而更好地理解程序,从中汲取有价值的内容. ...

  4. 【Linux】GCC程序开发工具(下)

    00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. objdump 03. objcopy命令 04. 总结 05. 附录 01. GCC的二进制工具 objdump 显示目标文 ...

  5. android应用程序开发_深圳app开发公司:跨平台应用程序开发工具有哪些?

    深圳app开发公司:跨平台应用程序开发工具有哪些?跨平台应用程序开发工具的出现是移动开发的发展和竞争的结果.对更快.更经济的应用程序开发的追求导致了跨平台技术的出现.在移动应用程序开发工具推荐中,哪些 ...

  6. 【Linux】GCC程序开发工具(上)

    00. 目录 文章目录 00. 目录 01. GNU工具概述 02. 常用文本文件 03. 常用二进制文件 04. Binutils工具集 05. GCC工具 06. 附录 01. GNU工具概述 ​ ...

  7. 程序崩溃 分析工具_程序分析工具| 软件工程

    程序崩溃 分析工具 A program analysis tool implies an automatic tool that takes the source code or the execut ...

  8. 最新版本微信小程序开发工具的使用

    微信小程序简介 微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或搜一下即可打 ...

  9. Microsoft的CL编译器与GCC到底有什么区别?

    解析CL编译器与GCC的各种差异 编译器版本 统一编译.查看命令 函数调用 栈帧分配 gcc结果 CL结果 函数的调用及传参 gcc结果 CL结果 总结 编译器版本 gcc -v: gcc versi ...

最新文章

  1. Py中的heapq模块【转载】
  2. Request.Params[CategoryID]
  3. 清华大学:2021元宇宙研究报告
  4. 大数据驱动5G网络与服务优化
  5. 改善深层神经网络:超参数调整、正则化以及优化——2.9学习率衰减
  6. linux修改默认发布目录,Linux环境更改Jenkins默认主目录
  7. RK3308(2) --- 上手教程
  8. 大数据“跨界”文化金融
  9. C++11 range-based for loop
  10. 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)
  11. Python的基本数据类型(1)
  12. 【Unity3D 灵巧小知识点】☀️ | Unity脚本生命周期
  13. 双目立体匹配算法:ELAS
  14. 如何在ps添加箭头_PS里怎么画箭头?PS画箭头三种方法介绍
  15. 数据分析~中国五大城市PM2.5数据分析01
  16. Unity Editor模式编辑属性即时生效
  17. GSY 作为开发者,这四年走过的身影,感谢技术让你我相遇
  18. 【2017.11.30】3. Longest Substring Without Repeating Characters-最长字串不重复字符
  19. 【JavaScript实训】-- 限时秒杀
  20. 跟我一起玩Win32开发(2):完整的开发流程

热门文章

  1. 即插即用——移动硬盘安装Ubuntu20.04
  2. 开源 cocos2d-html5版 五彩连珠.
  3. asp.net中使用JMail发邮件
  4. 【揭秘】云服务器1M带宽实际下载速度是多少?
  5. 使用photoshop将图片制作成圆形
  6. UICollectionView实现书本翻页布局
  7. 发电机失磁保护的整定计算
  8. 对接quickbooks问题记录
  9. P vs. NP:从一则数学家谋杀案说起
  10. Android产品研发(五)--多渠道打包