cl.exe 微软在Windows下的编译器

4 篇文章 0 订阅
4 篇文章 0 订阅

cl.exe用于生成编译文件obj
link.exe用于链接obj,生成最终的dll、lib或者exe文件

除非cl.exe特别指定/c选项,不然cl.exe会默认调用link.exe来链接生成的obj文件

注意:cl.exe指令选项是严格区分大小写的,而link.exe选项是不区分大小写的

cl.exe常用选项列表
···
/nologo 取消显示版权信息
/TC 按C语言方式编译
/TP 按C++方式编译
/sdl- 关闭sdl安装检查
/sdl sdl安装检查
/Zi 完整调试信息
/EHsc 使用标准C++异常,extern C内的函数当没有异常处理
/EHs 使用标准C++异常
/EHa try-catch可以捕获结构化异常
/I 附加include路径
/c 只编译产生obj文件,不链接,注意是小写的c
/{MDd|MD|MTd|MT} 几乎必备选项!!MD为动态链接msvc运行时库,MT为静态链接,带d表示debug模式
/source-charset:utf-8 指定源文件的编码,例如utf-8
/execution-charset:gbk 指定可执行文件的编码,例如gbk
/LD 创建动态链接库
/LDd 创建调试动态链接库
/std:{c++14|c++17|c11|c17} 规定标准,注意有冒号
/D 指定要定义的宏,通常msvc下定义 _DEBUG 宏,32位定义 WIN32 宏
/U 取消预定义的宏,或者取消/D定义的宏,不能取消代码中定义的宏
/Wall 显示完整告警信息
/W 显示指定等级的告警信息,n为1~4
/O{d|1|2|x} 优化等级,_DEBUG模式默认为/Od(不优化),/O1空间最小的优化,/O2时间最小的优化,/Ox全面的优化
/Ob{0|1|2} 内联处理等级,_DEBUG模式下默认为/Ob0,即不进行内联处理
/link <link.exe的参数选项> 在编译的时候同时指定link.exe的参数,注意一定要放在cl所有参数的最后!!!
/RTC1 快速检查
/Gd __cdecl 调用约定
/Gr __fastcall 调用约定
/Gz __stdcall 调用约定
/Gv __vectorcall 调用约定
/FC 诊断中使用完整路径名
/E 将预处理内容输出到stdout
/EP 将预处理内容消除#line、注释,并输出到stdout
/C 预处理时保留注释,可以搭配/EP使用
/P 将预处理内容输出到文件,使用该选项,将不会进行编译
/Fi: 指定生成的预处理文件的文件名
/Fo: 指定生成的obj文件的名字,路径名有空格要用双引号
/Fo 同上
/Fd: 指定pdb文件的名字,路径名有空格要用双引号
/Fd 同上
/Fe: 指定exe文件的名字,路径名有空格要用双引号
/Fe 同上
/Fa 指定产生的汇编文件的名字,一般后缀为.asm
···

link.exe常用选项
···
/nologo 隐藏版权信息
/pdb 生成的符号文件pdb的路径名
/debug 生成调试信息,当cl与link分开执行的时候,需要指定
/out: 指定生成的exe或者dll的名字
/libpath: 指定需要引用的lib库的路径
/subsystem:{console|windows|windowsse} 指定生成程序的类型,console控制台程序,windows窗口程序
/machine:{ARM|ARM64|ARM64X|EBC|X64|X86} 生成的程序的运行环境
/dll 指定是生成动态库dll的模式,而不是生成exe
/implib 指定生成的导入库.lib的名字
···

···
示例:
::简单的示例,编译链接main.cpp
cl /nologo /Zi /Wall /EHsc /MDd main.cpp
::编译链接main.cpp,并指定生成abc.exe
cl /nologo /Zi /Wall /EHsc /MDd main.cpp /Fe:abc.exe

::编译产生汇编文件,但是不链接,使用/c和/Fa选项,默认产生main.asm的汇编文件
cl /nologo /Zi /Wall /Ehsc /MDd /c /Fa main.cpp
::指定产生的汇编文件的名字,例如设成bbb.asm
cl /nologo /Zi /Wall /Ehsc /MDd /c /Fabbb.asm main.cpp

::cl和link分开使用,注意/c,一定要小写
cl /nologo /Zi /W3 /EHsc /MDd /c main.cpp
link /nologo /debug main.obj
::指定link生成的是abc.exe
link /nologo /debug /out:abc.exe main.obj

::编译时使用/D 定义__TEST1宏,值为20的__TEST2宏
cl /nologo /Zi /W3 /EHsc /MDd /c /D__TEST1 /D__TEST2=20 main.cpp
::定义值为"hello world"的宏STR,/D"STR=“hello world”" 或 /DSTR="“hello world”"
::定义宏时,还可以使用#来代替=,例如/D__TEST2#20 /DSTR#"“hello world”" /D"STR#“hello world”"

::编译时使用/U 取消前面/D定义的宏
cl /nologo /Zi /W3 /EHsc /MDd /c /D__TEST1 /D__TEST2=20 /U__TEST1 /U__TEST2 main.cpp

::cl和link在一条命令下使用
::假设需要包含"D:\include",调用"D:\lib\test.lib"库
cl /nologo /Zi /W3 /EHsc /MDd /I “D:\include” main.cpp /link /libpath:“D:\lib” test.lib

::生成dll动态库,会附带生成一个导入库main.lib
cl /nologo /Zi /W3 /EHsc /MDd main.cpp /link /dll /out:main.dll
::使用/implib指定生成动态库时,附带的导入库文件名为test.lib
cl /nologo /Zi /W3 /EHsc /MDd main.cpp /link /dll /out:main.dll /implib:test.lib
···

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值