Tuesday, March 16, 2010

CL and Link commands

You can compile and link c/c++ code via cl and link
Generic Examples
cl /Od /D /D_DEBUG /Yd /Zi /EHsc /MTd /GS /Fo"build/" /W3 /nologo /c

Important note for above example

/c - compile only. Without this, it will tries to link as well
/I - add 1 include folder
/D - add 1 user define marco
/D_DEBUG - add debug information


Important note for above example

/DEBUG - link with debug information
>/OUT - output name and location
/LIBPATH - add 1 library path

Sample Usage

cl /Od /D /D_DEBUG /Yd /Zi /EHsc /MTd /GS /Fo"build/" /W3 /nologo /c
/I "include" /I "test\include" /D "MY_MARCO1" /D "MY_MARCO2" src\*.c src\*.cpp

link /DEBUG /OUT:"output\my.dll" /INCREMENTAL:NO /NOLOGO
/LIBPATH:"lib" /LIBPATH:"my\lib" /DLL /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /IMPLIB:"output\my.lib" /MACHINE:X86 first.lib second.lib

For convenience, I copied the full cl and link options below




/O1 minimize space

/O2 maximize speed

/Ob<n> inline expansion (default n=0)

/Od disable optimizations (default)

/Og enable global optimization

/Oi[-] enable intrinsic functions

/Os favor code space

/Ot favor code speed

/Ox maximum optimizations

/Oy[-] enable frame pointer omission


/GF enable read-only string pooling

/Gm[-] enable minimal rebuild

/Gy[-] separate functions for linker

/GS[-] enable security checks

/GR[-] enable C++ RTTI

/GX[-] enable C++ EH (same as /EHsc)

/EHs enable C++ EH (no SEH exceptions)

/EHa enable C++ EH (w/ SEH exceptions)

/EHc extern "C" defaults to nothrow

/fp:<except[-]|fast|precise|strict> choose floating-point model:
except[-] - consider floating-point exceptions when generating code
fast - "fast" floating-point model; results are less predictable
precise - "precise" floating-point model; results are predictable
strict - "strict" floating-point model (implies /fp:except)

/GL[-] enable link-time code generation

/GA optimize for Windows Application

/Ge force stack checking for all funcs

/Gs[num] control stack checking calls

/Gh enable _penter function call

/GH enable _pexit function call

/GT generate fiber-safe TLS accesses

/RTC1 Enable fast checks (/RTCsu)

/RTCc Convert to smaller type checks

/RTCs Stack Frame runtime checking

/RTCu Uninitialized local usage checks

/clr[:option] compile for common language runtime, where option is:
pure - produce IL-only output file (no native executable code)
safe - produce IL-only verifiable output file
oldSyntax - accept the Managed Extensions syntax from Visual C++ 2002/2003
initialAppDomain - enable initial AppDomain behavior of Visual C++ 2002
noAssembly - do not produce an assembly

/Gd __cdecl calling convention

/Gr __fastcall calling convention

/Gz __stdcall calling convention

/GZ Enable stack checks (/RTCs)

/QIfist[-] use FIST instead of ftol()

/hotpatch ensure function padding for hotpatchable images

/arch:<SSE|SSE2> minimum CPU architecture requirements, one of:
SSE - enable use of instructions available with SSE enabled CPUs
SSE2 - enable use of instructions available with SSE2 enabled CPUs


/Fa[file] name assembly listing file

/FA[scu] configure assembly listing

/Fd[file] name .PDB file

/Fe<file> name executable file

/Fm[file] name map file

/Fo<file> name object file

/Fp<file> name precompiled header file

/Fr[file] name source browser file

/FR[file] name extended .SBR file

/doc[file] process XML documentation comments and optionally name the .xdc file


/AI<dir> add to assembly search path

/FU<file> forced using assembly/module

/C don't strip comments

/D<name>{=|#}<text> define macro

/E preprocess to stdout

/EP preprocess to stdout, no #line

/P preprocess to file

/Fx merge injected code to file

/FI<file> name forced include file

/U<name> remove predefined macro

/u remove all predefined macros

/I<dir> add to include search path

/X ignore "standard places"


/Zi enable debugging information

/Z7 enable old-style debug info

/Zp[n] pack structs on n-byte boundary

/Za disable extensions

/Ze enable extensions (default)

/Zl omit default library name in .OBJ

/Zg generate function prototypes

/Zs syntax check only

/vd{0|1|2} disable/enable vtordisp

/vm<x> type of pointers to members

/Zc:arg1[,arg2] C++ language conformance, where arguments can be:
forScope[-] - enforce Standard C++ for scoping rules
wchar_t[-] - wchar_t is the native type, not a typedef

/ZI enable Edit and Continue debug info

/openmp enable OpenMP 2.0 language extensions


@<file> options response file

/?, /help print this help message

/bigobj generate extended object format

/c compile only, no link

/errorReport:option Report internal compiler errors to Microsoft
none - do not send report
prompt - prompt to immediately send report
queue - at next admin logon, prompt to send report (default)
send - send report automatically

/FC use full pathnames in diagnostics

/H<num> max external name length

/J default char type is unsigned

/nologo suppress copyright message

/showIncludes show include file names

/Tc<source file> compile file as .c

/Tp<source file> compile file as .cpp

/TC compile all files as .c

/TP compile all files as .cpp

/V<string> set version string

/w disable all warnings

/wd<n> disable warning n

/we<n> treat warning n as an error

/wo<n> issue warning n once

/w<l><n> set warning level 1-4 for n

/W<n> set warning level (default n=1)

/Wall enable all warnings

/WL enable one line diagnostics

/WX treat warnings as errors

/Yc[file] create .PCH file

/Yd put debug info in every .OBJ

/Yl[sym] inject .PCH ref for debug lib

/Yu[file] use .PCH file

/Y- disable all PCH options

/Zm<n> max memory alloc (% of default)

/Wp64 enable 64 bit porting warnings


/LD Create .DLL

/LDd Create .DLL debug library

/LN Create a .netmodule

/F<num> set stack size

/link [linker options and libraries]

/MD link with MSVCRT.LIB

/MT link with LIBCMT.LIB

/MDd link with MSVCRTD.LIB debug lib

/MTd link with LIBCMTD.LIB debug lib

Visual C++ Linker Options
Linker Options

LINK is a tool that links Common Object File Format (COFF) object files and libraries to create a executable (.exe) file or dynamic-link library (DLL).

The table below is a comprehensive list of options for LINK.exe. This section also includes information on:

Linker options specified on the command line are not case sensitive: /base and /BASE mean the same thing.

You can specify some linker options via the comment pragma.




Specifies a response file


Specifies the alignment of each section


Specifies that a DLL cannot be bound


Specifies behavior for manifest lookup.


Adds the DebuggableAttribute to a managed image.


Create a link to a managed resource.


Specifies that a Microsoft Intermediate Language (MSIL) module should be imported into the assembly


Embeds a managed resource file to an assembly


Sets a base address for the program


Sets the type (IJW, pure, or safe) of a CLR image.


Preserves the last error code of functions called through the P/Invoke mechanism.


Specify which threading attribute you want applied 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.


Creates debugging information


Passes a module-definition (.def) file to the linker


Searches the specified library when resolving external references


Controls the delayed loading of DLLs


Causes the delayed loading of the specified DLL


Partially sign an assembly.


Builds a DLL


Creates a Windows NT kernel mode driver


Sets the starting address


Report internal linker errors to Microsoft.


Exports a function


Creates a program that can be loaded only at its preferred base address


Forces a link to complete in spite of unresolved or symbols defined more than once


Creates a hotpatchable image.


Sets the size of the heap in bytes


Specifies the name of the .idl file and other MIDL output files


Prevents processing attribute information into an .idl file


Overrides the default import library name


Forces symbol references


Controls incremental linking


Specify a key container to sign an assembly.


Specify key or key pair to sign an assembly.


Tells the compiler that the application supports addresses larger than two gigabytes


Allows the user to override the environmental library path


Specifies link-time code generation


Specifies the target platform


Create a side-by-side manifest file.


Specify a <dependentAssembly> section in your manifest file.

/MANIFESTFILE (Name Manifest File)

Change the default name of the manifest file.


Creates a mapfile


Includes the specified information in the mapfile


Combines sections


Specifies MIDL command line options


Suppresses the creation of a .NET Framework assembly


Ignores all (or specified) default libraries when resolving external references


Creates a resource-only DLL


Suppresses startup banner


Marks an executable as having been tested to be compatible with Windows Data Execution Prevention feature.


Controls LINK optimizations


Places COMDATs into the image in a predetermined order


Specifies the output file name


Creates a program database (PDB) file


Creates a program database (PDB) file with no private symbols


Specify .pgd file for profile guided optionizations.


Produces an output file that can be used with the Performance Tools profiler.


Sets the Checksum in the .exe header


Specify that the image will contain a table of safe exception handlers.


Overrides the attributes of a section


Sets the size of the stack in bytes


Attaches an MS-DOS stub program to a Win32 program


Tells the operating system how to run the .exe file


Tells the operating system to copy the linker output to a swap file before running it


Allows you to specify the resource ID of the linker-generated type library


Specifies the name of the .tlb file and other MIDL output files


Creates an application that is specifically designed to run under Terminal Server


Prints linker progress messages


Assigns a version number


Treat linker warnings as errors.

No comments:

Post a Comment