上一篇,我們問了幾個問題,這一篇就從hello.c的各個方面來研究研究,等到這一篇的結束來看這些疑惑有哪些是可以解答了的,當然還有一些可能要放到後面解決了……。
既然要抽絲剝繭,就要從手頭已有的線索出發,同時加上搜索到的知識,以及自己的思考,任何問題的解決都是通過這個路徑(當然,老板除外,老板這種生物只需要發出指令,然後得到結果就OK了……)。
我們現在有的,是一個hello.c文件,通過cl命令就可以生成目標hello.exe文件。
那我們就可以研究一下cl這個東西。
CL解釋
CL.EXE(或cl.exe,似乎windows的文件系統對於大小寫是不敏感的),是何許人也呢?直接引用微軟的說辭吧。
CL.exe is a 32-bit tool that controls the Microsoft C and C++ compilers and linker. The compilers produce Common Object File Format (COFF) object (.obj) files. The linker produces executable (.exe) files or dynamic-link libraries (DLLs).
Note that all compiler options are case sensitive.
To compile without linking, use /c.
因為VC6的版本說明沒有找到,這裡的說明文字是Visual studio 2003的CL.EXE說明,不過都是一樣的。從上面的說明可以看到CL是用來控制微軟C和C++編譯器(compiler)和鏈接器(linker),一共做了兩件事情。編譯器會生成COFF文件格式的目標文件(.obj);鏈接器會生成可執行文件(.exe)或者動態鏈接庫文件(DLLs)。
對比我們之前的做法,的確是執行cl命令之後,生成了一個hello.obj文件和一個hello.exe文件。
另外在最後,還說明了一下,使用/c選項,則可以不進行鏈接過程。
CL選項
那cl還有哪些選項呢?使用cl /?來看看。
1 d: est>cl /? 2 Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 3 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. 4 5 C/C++ COMPILER OPTIONS 6 7 -OPTIMIZATION- 8 9 /O1 minimize space /Op[-] improve floating-pt consistency10 /O2 maximize speed /Os favor code space11 /Oa assume no aliasing /Ot favor code speed12 /Ob<n> inline expansion (default n=0) /Ow assume cross-function aliasing13 /Od disable optimizations (default) /Ox maximum opts. (/Ogityb1 /Gs)14 /Og enable global optimization /Oy[-] enable frame pointer omission15 /Oi enable intrinsic functions16 17 -CODE GENERATION-18 19 /G3 optimize for 80386 /Gy separate functions for linker20 /G4 optimize for 80486 /Ge force stack checking for all funcs21 /G5 optimize for Pentium /Gs[num] disable stack checking calls22 /G6 optimize for Pentium Pro /Gh enable hook function call23 /GB optimize for blended model (default) /GR[-] enable C++ RTTI24 /Gd __cdecl calling convention /GX[-] enable C++ EH (same as /EHsc)25 /Gr __fastcall calling convention /Gi[-] enable incremental compilation26 /Gz __stdcall calling convention /Gm[-] enable minimal rebuild27 /GA optimize for Windows Application /EHs enable synchronous C++ EH28 /GD optimize for Windows DLL /EHa enable asynchronous C++ EH29 30 /Gf enable string pooling /EHc extern "C" defaults to nothrow31 /GF enable read-only string pooling /QIfdiv[-] enable Pentium FDIV fix32 /GZ enable runtime debug checks /QI0f[-] enable Pentium 0x0f fix33 34 -OUTPUT FILES-35 36 /Fa[file] name assembly listing file /Fo<file> name object file37 /FA[sc] configure assembly listing /Fp<file> name precompiled header file38 /Fd[file] name .PDB file /Fr[file] name source browser file39 /Fe<file> name executable file /FR[file] name extended .SBR file40 /Fm[file] name map file41 42 -PREPROCESSOR-43 44 /C dont strip comments /FI<file> name forced include file45 /D<name>{=|#}<text> define macro /U<name> remove predefined macro46 /E preprocess to stdout /u remove all predefined macros47 /EP preprocess to stdout, no #line /I<dir> add to include search path48 /P preprocess to file /X ignore "standard places"49 50 -LANGUAGE-51 52 /Zi enable debugging information /Zl omit default library name in .OBJ53 /ZI enable Edit and Continue debug info /Zg generate function prototypes54 55 /Z7 enable old-style debug info /Zs syntax check only56 /Zd line number debugging info only /vd{0|1} disable/enable vtordisp57 /Zp[n] pack structs on n-byte boundary /vm<x> type of pointers to members58 /Za disable extensions (implies /Op) /noBool disable "bool" keyword59 /Ze enable extensions (default)60 61 -MISCELLANEOUS-62 63 /?, /help print this help message /V<string> set version string64 /c compile only, no link /w disable all warnings65 /H<num> max external name length /W<n> set warning level (default n=1)66 /J default ch