進行編譯,就能生成乙個簡單的hello.exe檔案。其實這個可執行檔案的產生需要呼叫兩個程式:cl.exe和link.exe。
先看一看cl.exe的options:
/nologo /mld /w3 /gm /gx /zi /od /d "win32" /d "_debug" /d "_windows" /d "_mbcs" /fp"debug/hello.pch" /yx /fo"debug/" /fd"debug/" /fd /gz /c
再看一看link.exe的options:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib
uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /subsystem:windows /incremental:yes
/pdb:"debug/hello.pdb" /debug /machine:i386 /out:"debug/hello.exe" /pdbtype:sept
下面就來解析一下這些引數的含義:
cl編譯器:
雜項-miscellaneous-:
1. /nologo
2. /c compile only, no link
3. /wset warning level (default n=1)
4. /yx[file] automatic .pch
預處理-preprocessor-:
5. /d定義乙個巨集,比如 /dwin32 。其實/dwin32 和在原始檔的偽指令 #define win32是一樣的。
輸出檔案-output files-:
6. /focl的輸出檔案就是.obj檔案。這裡可以指定.obj檔案的路徑和名稱。
7. /fd[file] cl也會輸出乙個.pdb檔案,預設情況下為vc60.pdb。這裡可以指定pdb檔案的名稱。
8. /fpcl也會輸出乙個.pch檔案,預設情況下和可執行檔名相同。這裡指定路徑和名稱(precompiled header file)。
**生產-code generation-:
9. /gz _stdcall calling convention
/gd _cdecl calling convention
10. /gm[-] enable minimal rebuild
11. /gx[-] enable c++ eh (same as /ehsc)
**優化-optimization-:
12. /od disable optimizations (default)
鏈結選項-linking-:
13. /mld link with libcd.lib debug lib
語言-language-:
14. /zi enable edit and continue debug info
link鏈結器:
linker我通過google「vc link options」搜了一些資訊,搜到了microsoft的官方**。找到了「c/c++ building reference」,裡面有compiler options和liner options:
1. /debug:用於建立乙個.pdb(program database )檔案,此檔案中包含本程式的debugging information。
2. 預設情況下,生成的.pdb檔案的名稱和可執行檔案的名字是一樣的,並且和可執行檔案在同乙個目錄下。如果要手動指定.pdb檔案的名稱和路徑,就要用到/pdb選項。比如:/pdb:debug/hello.pdb
注意:if /debug is not specified, the /pdb option is ignored。
3. /subsystem:windows 子系統選擇,常用的就兩個:windows和console。
4. /out:filename /out選項可以指定生產的可執行檔案的名字和路徑
5. /machine:i386 硬體平台,我們常用的電腦都是x86平台的。
有乙個地方需要十分地注意:
我們看到上面cl.exe的options中有乙個選項: /d "_windows" 。這個選項的意思前面已經說過了,就類似於在程式中有這樣一條語句:
#define _windows
可是我在文件里查到的「/d」的用法是:/dname[=|#]。就是說/d和它後面的那個name之間是沒有空格的,也沒有雙引號。為什麼這裡會有雙引號和空格呢?經過自己試驗,發現這個空格和雙引號是這個整合開發環境自動加上的。假設我要用/d定義乙個巨集page_size,我可以在這個「project options」下面的文字框中輸入 /dpage_size ,然後我點ok按鈕後,再重新開啟這個對話方塊,就會看到已經變成 /d "page_size" 。別的選項也是類似的。呵呵,這點可需要注意一下噢。
VC6 0 編譯器BUG修正收集
1.error spawning bscmake.exe 解決 project,setting,browse info,去掉選項build browse info file 2.fatal error lnk1210 exceeded internal ilk size limit relink w...
關於VC6 0 和其他VS編譯器
最近想寫一些 mfc應用程式,在發布的時候遇到了幾個問題,從中得到了一點體會,與大家分享一下。遇到的幾方面問題的起因 1.自己用vs 剛換win7 編譯好的程式在其他人那裡無法執行,提示缺少 mfc庫 2.上面的問題好解決,用靜態 mfc方式重新發布,卻發現原本 200多 k的程式變成了 1m多。3...
這算是VC6 0編譯器的乙個Bug麼?
首先看看上面這段c 按照c語言的運算子優先順序規則,這個程式的執行結果應該是18 首先執行完小括號裡的三個 a,這時a就為6,然後在執行加法運算,3個a相加自然等於18 可是我在vc6.0下編譯這段程式時,如果編譯為debug版,則輸出結果為16,如果編譯為release版本,則輸出結果為18。為什...