最近在使用lua,环境是windows.lua源码只提供了Makefile配置,之前多用CMake编译开源项目,看到lua编译文档中也有提供CMakeLists配置文件,因为没有在windows下单独使用cl和link的经验,所以准备先学习一下编译器和链接器选项.
CL.EXE
在MSDN的Compiler Options文档可以学习到cl的完整编译选项.这里(Compiler Options Listed by Category)提供完整的选项分类(/option和-option是一样的).
编译优化:
Option |
Purpose |
---|---|
/O1 |
等同于/Og /Os /Oy /Ob2 /Gs /GF /Gy,编译会进行代码最小优化 |
/O2 |
等同于/Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy,编译器会进行代码最快优化.这是默认设置,也是release下采用的设置. |
/Ob |
内联函数展开控制.0不执行内联展开,1只内联展开类内定义的内联函数,2内联展开所有的内联函数. |
/Od |
禁止优化可以方便代码调试, |
/Og |
包含子表达式优化,寄存器分配(常用变量和子表达式),循环优化. |
/Oi |
使用内在函数可以减少函数调用的开销,通过编译器指令#pragma intrinsic来指定内在函数,内在函数列表在这里. |
/Os |
生成更小的代码. |
/Ot |
生成更快的代码. |
/Ox |
完全优化,生成更小更快的代码..等同/Ob /Og /Oi /Ot /Oy. |
/Oy |
禁用调用堆栈./Oy- 开启调用堆栈方便调试. |
/favor |
根据处理器平台进行优化,可选{blend | ATOM | AMD64 | INTEL64}. |
Option |
Purpose |
---|---|
/arch |
指定使用的指令集,可选[IA32|SSE|SSE2|AVX]. |
/clr |
使用clr环境,具体可以参看clr选项. |
/EH |
指定如何处理异常. |
/fp |
指定浮点数行为. |
/GA |
对于wiindows可执行程序使用程序优化,声明为__declspec(thread)线程内的数据可以更快地访问,不要用于DLL程序. |
/Gd |
调用约定. /Gd:将除成员函数以外的函数都指定为_cdecl(参数传入从右到左,函数调用从栈内pop,下划线修饰函数,没有大小写转换),程式内 制定的 __stdcall, __fastcall, or__vectorcall都会被覆盖. /Gz:指定调用约定为_stdcall(对成员函数,main函数,和指定了调用约定的函数无效)._stdcall(参数右到左传入,除了指针和 引用以外都按值传入对于类会调用复制构造函数,函数以下划线_作为前缀,参数用@连接,无大小写转换)只对x86有效. /Gr:指定_fastcall(头两个DWORD的参数从左到又传入ECX和EDX寄存器,剩下的从右到左传入,以@parameter-size<十进制> 作为函数名前缀,无大小写转换)调用约定,指定规则和适用平台和_stdcall一样. /Gv指定_vectorcall(尽可能使用寄存器传入参数,@@parameter-size<十进制>作为函数名前缀,无大小写转换)调用约定,对 含有可变参数的函数无效,支持x86和x64支持SSE2指令集及以上指令集的架构. |
/Ge |
启用堆栈探针,结合/Gh指定探针钩子. |
/GF |
使用字符池,那么同一个字符串只会创建一份,使用时编译器会将多个变量指向同一地址. |
/Gh |
探针钩子_penter,结合/Ge使用. |
/GH |
函数退出钩子_pexit. |
/GL |
使能全程序优化,通过/Gl-关闭全程序优化,只进行模块内优化. |
/Gm |
使能最小构建.通过 .idb文件检测源码变化. |
/GR |
使能运行时类型信息 (RTTI),关闭时无法使用dynamic_cast和typeid,关闭后可以减少程序大小. |
/Gr |
见/Gd部分. |
/GS |
检查缓冲区溢出. |
/Gs |
设置栈探针触发前函数可以使用多少内存.默认为4kb |
/GT |
对线程内数据支持fiber safety,禁用/Og对这种数据类型的优化. |
/Gv |
见/Gd部分. |
/Gw |
使能全局数据优化,将全局数据放在COMDAT段. |
/GX |
使能异常处理(假定extern c函数从不抛出异常),已经废弃,使用/Gh替代. |
/Gy |
允许编译器组织个体函数. |
/GZ |
使能运行时错误检测.已废弃. |
/Gz |
见Gd部分. |
/homeparams |
强制将寄存器参数传入栈中,是的release下也能进行调试. (only for x64 native and cross compile). |
/hotpatch |
使得创建的映像文件支持hot patching,利用hot patching可以hack函数行为. |
/Qfast_transcendentals |
为超越函数(对数函数,反三角函数,指数函数等)生成内联代码. |
/QIfist |
根据ASCII C标准,浮点转整形是会忽略小数部分的(x86 only),通过/QIfist可以关闭这个特性,根据intel处理器参考文档,其提供四种 舍入方式1)取最近的整数,类似[x].2)舍入正无穷.3)舍入负无穷.4)舍入到0.默认的舍入模式为1),可以通过运行时函数 _control87, _controlfp, _control87_2来修改舍入方式. |
/Qimprecise_fwaits |
当选项/fp:except打开的时候,编译器会在每个try块内的语句附近插入一条fwait指令,这样遇到异常时,编译器可以确定是出现在哪行.开启这个选项则会关闭编译器的这个特性. |
/Qpar |
开启循环并行计算特性,利用多核并行的优势,能显著提高执行速度.#pragma loop()告诉编译器可以惊醒并行优化. |
/Qpar-report |
设置循环并行计算报告等级,结合/Qpar选项使用. |
/Qsafe_fp_loads |
禁用浮点数加载优化,使用整数加载指令.(x86 only)防止加载异常情况发生,比如NAN. |
/Qvec-report (Auto-Vectorizer Reporting Level) |
Enables reporting levels for automatic vectorization. |
/RTC |
使能运行时错误检测. |
/volatile |
设置关键字volatile解释方式. |
Option |
Purpose |
---|---|
/doc |
为源码生成.xdc格式的文档,xdc格式可以通过xdcmake.exe工具输出xml.微软推荐的文档标签. |
/FA |
/FA输出汇编代码.asm. /FAs输出机器码和汇编码.cond. /FAs输出源码和汇编码.asm. /FAu使用UTF8编码输出. |
/Fa |
/FA可加参数的版本. |
/Fd |
指定调试文件pdb的名称. |
/Fe |
指定输出文件exe或者DLL的名称. |
/Fi |
指定预处理输出文件名称. |
/Fm |
指定输出的段档案名称. |
/Fo |
指定编译文件.obj的名称. |
/Fp |
指定要使用的预处理头文件.pch. |
/FR /Fr |
指定创建的.sbr文件名称,BSCMAKE工具使用此文件来创建浏览信息. |
Option |
Purpose |
---|---|
/AI |
指定#using指令搜索目录. |
/C |
预处理时保留注释. |
/D |
定义常量和宏. |
/E |
将预处理器输出复制到标准输出.使用#line指令对预处理过的文件行进行重排,是的错误指向的函数为源文件的真实行数. |
/EP |
同上,但是不加#line指令,错误行数指向预处理过后的行数,而不是源文件行数. |
/FI |
强制为源文件添加头文件. |
/FU |
强制为源文件添加#using文件. |
/Fx |
合并注入代码,通过穿件.mgr文件进行代码注入,注意.mgr文件内不支持宏展开, |
/I |
指定头文件包含搜索目录. |
/P |
将预处理输出到指定文件. |
/U |
#undef预定义符号. |
/u |
#undef微软预定义符号. |
/X |
禁用从 PATH和INCLUDE变量定义的路径搜索包含头文件. |
Option |
Purpose |
---|---|
/openmp |
使能 #pragma omp指令,支持opemMP 2.0标准,高效多处理器操作接口(待学习). |
/vd |
vtordisp(virtual construction/destruction displacement)待学习. |
/vmb |
必须先定义类,才能定义指向类成员的指针. |
/vmg |
可以在类定义之前定义类成员指针,可以解决类成员交叉引用的问题. |
/vmm |
编译器表示类成员变量指针的方式为多继承. |
/vms |
编译器表示类成员变量指针的方式为单继承. |
/vmv |
编译器表示类成员变量指针的方式为虚继承. |
/Z7 |
调试信息配置.所有调试信息输出到.obj,不产生.pdb文件. |
/Za |
禁用ANSI C和 ANSI C++标准以外的语言扩展.利用此选项来编写多平台代码. |
/Zc |
指定在语言扩展下的语言行为. |
/Ze |
和/Za相反,启用微软的语言扩展. |
/Zg |
生成函数原型. |
/ZI |
调试信息配置.和/Zi一样,但是会禁用#pragma optimize指令,支持编辑并继续. |
/Zi |
控制调试信息配置.输出类型了符号调试信息到.pdb文件,此选项不影响优化. |
/Zl |
忽略运行时函数库.C Runtime Library的特性不再使用. |
/Zp n |
指定结构体成员的对齐大小. |
/Zs |
编译器只进行语法检测. |
/ZW |
进行windows运行时编译,用于生成支持微软应用商店的应用. |
Option |
Purpose |
---|---|
/F |
设置栈大小(字节). |
/LD |
创建动态连接库,如果没有制定导出文件.exp,则会创建导入库.lib.默认使用多线程C运行库. |
/LDd |
创建可调试的动态链接库. |
/link |
传入链接器参数. |
/LN |
创建微软中间件模块. |
/MD |
编译使用多线程库的Dll,MSVCRT.lib. |
/MDd |
编译使用调试版多线程库, MSVCRTD.lib. |
/MT |
编译使用多线程库的可执行文件,LIBCMT.lib. |
/MTd |
编译使用可调式多线程库的可执行文件 LIBCMTD.lib. |
Option |
Purpose |
---|---|
/Y- |
I忽略所有的预编译头文件选项. |
/Yc |
创建预编译头文件 |
/Yd |
将预编译头文件中的所有调试信息输出到.obj文件中. |
/Yu |
使用预编译头文件. |
Option |
Purpose |
---|---|
/? |
编译器帮助. |
@ |
指定编译器响应文件,文件内所有的命令都会作用到命令行,尤其适合命令长度大于127个字符的情况. |
/analyze |
使能代码分析. |
/bigobj |
可寻址段从65,536 (2^16)个增加到 4,294,967,296 (2^32)个. |
/c |
只编译,不链接. |
/errorReport |
开启错误报告. |
/FC |
输出诊断信息时打印源文件的绝对路径. |
/FS |
强制同步写pdb文件. |
/H |
限制外部名字长度,默认为2047,/H选项只能指定比2047小的长度.. |
/HELP |
帮助. |
/J |
使默认char的为unsigned char,并且转换为整形时为零扩展. |
/kernel |
创建内核模式二进制文件. |
/MP |
并行构建. |
/nologo |
禁用l编译器信息显示. |
/sdl |
开启安全开发周期检测,产生更多的编译警告. |
/showIncludes |
在编译期输出所有包含的头文件. |
/Tc /TC |
/Tc指定源文件为C源文件,即使后缀不对./TC对待的所有源文件都是C源文件. |
/Tp /TP |
/Tp指定源文件为C++源文件,即使后缀不对./TP吧所有源文件当C++源文件对待. |
/V |
指定版本或者版权信息,将会输出到.obj. |
/Wall |
输出所有警告. |
/W |
设置警告等级. |
/w |
关闭警告. |
/WL |
输出更多的诊断信息. |
/Wp64 |
检测64位系统上可能存在的类型问题,典型的有int, long, pointer. |
/Yd |
Places complete debugging information in all object files. |
/Yl |
为调试库注入pch引用,在创建使用预编译头文件的调试库出错时可能需要设置这个选项. |
/Zm |
指定构建预编译头文件能使用的最大内存. |
Option |
Purpose |
---|---|
@ |
Specifies a response file. |
/ALIGN |
Specifies the alignment of each section. |
/ALLOWBIND |
Specifies that a DLL cannot be bound. |
/ALLOWISOLATION |
Specifies behavior for manifest lookup. |
/APPCONTAINER |
Specifies whether the app must run within an appcontainer process environment. |
/ASSEMBLYDEBUG |
Adds the DebuggableAttribute to a managed image. |
/ASSEMBLYLINKRESOURCE |
Creates a link to a managed resource. |
/ASSEMBLYMODULE |
Specifies that a Microsoft intermediate language (MSIL) module should be imported into the assembly. |
/ASSEMBLYRESOURCE |
Embeds a managed resource file in an assembly. |
/BASE |
Sets a base address for the program. |
/CLRIMAGETYPE |
Sets the type (IJW, pure, or safe) of a CLR image. |
/CLRSUPPORTLASTERROR |
Preserves the last error code of functions that are called through the P/Invoke mechanism. |
/CLRTHREADATTRIBUTE |
Specifies the threading attribute to apply to the entry point of your CLR program. |
/CLRUNMANAGEDCODECHECK |
Specifies whether the linker will apply the SuppressUnmanagedCodeSecurity attribute to linker-generated PInvoke stubs that call from managed code into native DLLs. |
/DEBUG |
Creates debugging information. |
/DEF |
Passes a module-definition (.def) file to the linker. |
/DEFAULTLIB |
Searches the specified library when external references are resolved. |
/DELAY |
Controls the delayed loading of DLLs. |
/DELAYLOAD |
Causes the delayed loading of the specified DLL. |
/DELAYSIGN |
Partially signs an assembly. |
/DLL |
Builds a DLL. |
/DRIVER |
Creates a kernel mode driver. |
/DYNAMICBASE |
Specifies whether to generate an executable image that can be randomly rebased at load time by using the address space layout randomization (ASLR) feature. |
/ENTRY |
Sets the starting address. |
/errorReport |
Reports internal linker errors to Microsoft. |
/EXPORT |
Exports a function. |
/FIXED |
Creates a program that can be loaded only at its preferred base address. |
/FORCE |
Forces a link to complete even with unresolved symbols or symbols defined more than once. |
/FUNCTIONPADMIN |
Creates an image that can be hot patched. |
/HEAP |
Sets the size of the heap, in bytes. |
/HIGHENTROPYVA |
Specifies support for high-entropy 64-bit address space layout randomization (ASLR). |
/IDLOUT |
Specifies the name of the .idl file and other MIDL output files. |
/IGNOREIDL |
Prevents the processing of attribute information into an .idl file. |
/IMPLIB |
Overrides the default import library name. |
/INCLUDE |
Forces symbol references. |
/INCREMENTAL |
Controls incremental linking. |
/INTEGRITYCHECK |
Specifies that the module requires a signature check at load time. |
/KEYCONTAINER |
Specifies a key container to sign an assembly. |
/KEYFILE |
Specifies a key or key pair to sign an assembly. |
/LARGEADDRESSAWARE |
Tells the compiler that the application supports addresses larger than two gigabytes |
/LIBPATH |
Enables user override of the environmental library path. |
/LTCG |
Specifies link-time code generation. |
/MACHINE |
Specifies the target platform. |
/MANIFEST |
Creates a side-by-side manifest file and optionally embeds it in the binary. |
/MANIFESTDEPENDENCY |
Specifies a |
/MANIFESTFILE |
Changes the default name of the manifest file. |
/MANIFESTINPUT |
Specifies a manifest input file for the linker to process and embed in the binary. You can use this option multiple times to specify more than one manifest input file. |
/MANIFESTUAC |
Specifies whether User Account Control (UAC) information is embedded in the program manifest. |
/MAP |
Creates a mapfile. |
/MAPINFO |
Includes the specified information in the mapfile. |
/MERGE |
Combines sections. |
/MIDL |
Specifies MIDL command-line options. |
/NOASSEMBLY |
Suppresses the creation of a .NET Framework assembly. |
/NODEFAULTLIB |
Ignores all (or the specified) default libraries when external references are resolved. |
/NOENTRY |
Creates a resource-only DLL. |
/NOLOGO |
Suppresses the startup banner. |
/NXCOMPAT |
Marks an executable as verified to be compatible with the Windows Data Execution Prevention feature. |
/OPT |
Controls LINK optimizations. |
/ORDER |
Places COMDATs into the image in a predetermined order. |
/OUT |
Specifies the output file name. |
/PDB |
Creates a program database (PDB) file. |
/PDBALTPATH |
Uses an alternate location to save a PDB file. |
/PDBSTRIPPED |
Creates a program database (PDB) file that has no private symbols. |
/PGD |
Specifies a .pgd file for profile-guided optimizations. |
/PROFILE |
Produces an output file that can be used with the Performance Tools profiler. |
/RELEASE |
Sets the Checksum in the .exe header. |
/SAFESEH |
Specifies that the image will contain a table of safe exception handlers. |
/SECTION |
Overrides the attributes of a section. |
/STACK |
Sets the size of the stack in bytes. |
/STUB |
Attaches an MS-DOS stub program to a Win32 program. |
/SUBSYSTEM |
Tells the operating system how to run the .exe file. |
/SWAPRUN |
Tells the operating system to copy the linker output to a swap file before it is run. |
/TLBID |
Specifies the resource ID of the linker-generated type library. |
/TLBOUT |
Specifies the name of the .tlb file and other MIDL output files. |
/TSAWARE |
Creates an application that is designed specifically to run under Terminal Server. |
/VERBOSE |
Prints linker progress messages. |
/VERSION |
Assigns a version number. |
/WINMD |
Enables generation of a Windows Runtime Metadata file. |
/WINMDFILE |
Specifies the file name for the Windows Runtime Metadata (winmd) output file that's generated by the /WINMD linker option. |
/WINMDKEYFILE |
Specifies a key or key pair to sign a Windows Runtime Metadata file. |
/WINMDKEYCONTAINER |
Specifies a key container to sign a Windows Metadata file. |
/WINMDDELAYSIGN |
Partially signs a Windows Runtime Metadata (.winmd) file by placing the public key in the winmd file. |
/WX |
Treats linker warnings as errors. |