當前位置:首頁 » 編程軟體 » 工程文件按條件編譯

工程文件按條件編譯

發布時間: 2022-04-20 08:50:06

㈠ 打開一個DEV C++的工程文件(.dev),如何判斷該工程按C語法編譯還是按C++語法編譯

這個就要看你的設置問題了,我的devC++裡面保存為C編譯就不會通過的。下圖所示:

在你的工具->編譯選項->程序中,可以設置你編譯c語言程序時,採取的標注是gcc還是g++。

㈡ delphi XE 怎樣設置全局編譯條件

1,在工程所在文件夾新建xxx.inc。
2,在pas文件第一行加入{$I xxx.inc}

㈢ c語言程序設計的黃容、趙毅主編

1.1一個C語言程序
1.2計算機程序設計與程序設計語言
1.2.1程序與指令
1.2.2程序設計語言
1.3C語言的發展與應用現狀
1.4C語言的特點
1.4.1C語言的優勢
1.4.2如何學習C語言程序設計
1.4.3C語言的語法特點
1.4.4C語言的結構特點
1.4.5C語言的編譯與編程環境
習題
第2章用C語言編寫簡單程序
2.1在屏幕上顯示自定義文字「Hello World!」
2.1.1程序解析
2.1.2程序的三種結構
2.2攝氏溫度與華氏溫度換算(簡單的順序結構程序的編寫)
2.2.1程序解析
2.2.2常量、變數和數據類型
2.2.3賦值運算和算術運算
2.2.4格式化輸出函數printf
2.3判斷一元二次方程是否有實數解(簡單的分支結構程序的編寫)
2.3.1程序解析
2.3.2關系運算
2.3.3if…else二分支語句
2.3.4格式化輸入函數scanf
2.4計算自由落體反彈高度和總距離(簡單的循環結構程序
——for語句的編寫)
2.4.1指定次數的循環程序設計
2.4.2for語句
2.4.3計算自由落體反彈高度和總距離
2.4.4程序解析
習題
第3章分支結構程序設計
3.1從鍵盤輸入一個控制命令字元,判斷輸入是否正確
3.1.1程序解析
3.1.2字元類型
3.1.3邏輯運算符和邏輯表達式
3.1.4字元型數據的輸入和輸出
3.2分支結構程序設計——求解一元二次方程
3.2.1程序解析
3.2.2if 語句的三種形式
3.2.3if 語句的嵌套
3.3模擬工程式控制制,根據指令進行相應的操作
3.3.1程序解析
3.3.2switch語句
習題
第4章循環結構程序設計
4.1輸入一批學生的成績,統計平均分
4.1.1程序解析
4.1.2while語句
4.1.3數列問題求解
4.2用牛頓迭代法求方程2x3-4x2+3x-6=0的根
4.2.1程序解析
4.2.2do…while 語句
4.2.3循環語句的選擇
4.3列印九九乘法表
4.3.1程序解析
4.3.2循環的嵌套
4.4求素數
4.4.1程序解析
4.4.2用break語句和continue語句改變循環狀態
4.5復雜循環結構程序設計
4.5.1傅里葉級數逼近
4.5.2數據處理與回歸分析
習題
第5章C語言的數據類型和表達式
5.1C語言的基本數據類型
5.2常量和變數
5.2.1常量
5.2.2變數
5.3運算符和表達式
5.3.1算術運算符和算術表達式
5.3.2強制類型轉換運算符
5.3.3自增、自減運算符
5.3.4賦值運算符和賦值表達式
5.3.5關系運算符和表達式
5.3.6邏輯運算符和表達式
5.3.7條件表達式
5.3.8逗號表達式
5.4綜合程序設計案例
5.5演算法與程序設計
習題
第6章數組
6.1排序問題
6.1.1程序解析
6.1.2一維數組的定義和引用
6.1.3一維數組的初始化
6.1.4使用一維數組編程
6.2找出矩陣中最大值所在的位置
6.2.1程序解析
6.2.2二維數組的定義和引用
6.2.3二維數組的初始化
6.3數據通信過程中的信息加密問題
6.3.1程序解析
6.3.2一維字元數組
6.3.3字元串處理
習題
第7章函數
7.1用函數求幾何圖形的面積
7.1.1程序解析
7.1.2函數的定義
7.1.3函數的聲明
7.1.4函數的調用
7.2用函數求Fibonacci數列
7.2.1程序解析
7.2.2形式參數與實際參數
7.2.3函數的返回值
7.2.4值傳遞與地址傳遞
7.3變數與函數
7.3.1局部變數和全局變數
7.3.2變數的存儲類別
7.3.3函數的遞歸調用——求n!
習題
第8章指針及其應用
8.1替代用變數名引用數據的新方法
8.1.1指針概念的引入
8.1.2定義指針變數
8.1.3指針與變數的關系
8.1.4為指針變數賦值及指針變數的初始化
8.1.5利用指針變數進行數據處理
8.2指針和一維數組
8.3利用被調函數對主調函數中的數組元素進行冒泡排序
8.3.1指針變數作為函數參數
8.3.2數組名作為函數的參數
8.4字元串和字元指針
8.4.1字元串常量的值
8.4.2使用字元指針處理字元串的程序舉例
習題
第9章結構體、共用體和枚舉類型
9.1按價格排序輸出一組待售汽車的信息
9.1.1程序解析
9.1.2結構體類型的概念和定義
9.1.3結構體類型變數的定義
9.1.4結構體類型變數的使用
9.1.5結構體變數作為函數參數
9.2編寫一個書籍管理程序,顯示所有書籍信息
9.2.1程序解析
9.2.2結構體數組
9.2.3結構體數組的應用實例
9.3共用體——每個時刻只能有一個成員佔用內存的「結構體」
9.3.1程序解析
9.3.2共用體類型的定義
9.3.3共用體變數的定義
9.3.4共用體變數的引用
9.4讓變數的取值局限於特定范圍
9.4.1枚舉類型的定義
9.4.2枚舉變數的定義
9.4.3枚舉類型的應用
9.5隨心所欲地安排數據類型名——typedef的使用方法
9.5.1利用typedef定義類型名
9.5.2typedef的典型用法
習題
第10章宏定義與文件包含
10.1宏定義
10.1.1程序解析
10.1.2無參宏定義
10.1.3帶參宏定義
10.2文件包含
10.3條件編譯
習題
第11章文件
11.1將「歡迎卓越工程師」寫入文件
11.1.1程序解析
11.1.2C文件概述
11.1.3文件指針
11.1.4文件的打開與關閉
11.2文件的讀寫——讀取工程文件
11.2.1程序解析——讀取工程文件
11.2.2字元讀寫函數fgetc和fputc
11.2.3字元串讀寫函數fgets和fputs
11.2.4數據塊讀寫函數fread和fwrite
11.2.5格式化讀寫函數fscanf和fprintf
11.3文件的隨機讀寫
11.3.1改變文件位置指針函數fseek( )
11.3.2位置指針重返文件頭函數rewind( )
11.3.3位置指針當前值函數 ftell( )
11.3.4文件的隨機讀寫
11.4文件檢測函數
11.4.1文件結束檢測函數feof函數
11.4.2讀寫文件出錯檢測函數ferror函數
11.4.3文件出錯標志和文件結束標志置0函數clearerr函數
習題
附錄AASCII編碼表
附錄BC語言常用的庫函數
附錄CC語言運算符優先順序表
參考文獻

㈣ 怎麼在DOS下編譯C++程序

VC6隻是一個IDE,可以方便的調用編譯器,鏈接器,頭文件,庫文件,如果編輯和編譯驅動能集成在一起,這樣可以提高開發效率。

對於普通的Win32應用程序,VC6已經默認支持了,而對於驅動程序沒有設定好的工程向導。其實驅動程序也就是一個sys,是通過c語言寫成,所以編譯它理論上沒有問題,只是在實際操作上有點麻煩。

下面就來說明一下各種平台編譯sys驅動的方法(包括64位平台)。

先看32位版本驅動的編譯方法,首先你得准備一些編譯必備工具:

1.要安裝VC6

2.安裝DDK(裝哪個呢?這個問題其實很簡單的,只是很多人不明白,裝DDK當然是越新越好了,越新支持的平台越多,像2000DDK你是絕對編譯不出來64位sys的,因為它沒帶64位的庫和編譯器,所以我們選擇現在最比較新的,2003DDK(WDK也可以),支持的平台很多(AMD64,IA64,2000,XP,2003都支持)。

好了,這下我們的系統已經安裝了最強的開發工具VC6,最新DDK,在VC里編譯各個平台的驅動都沒有問題了!

開始,假設我們的DDK裝在C:\2003DDK目錄,那麼我會發現裡面有很多驅動的例子(安裝的時候全選),我們選擇C:\2003DDK\src\wdm\usb\bulkusb作為我們的實驗範例。

第一步:

打開VC,建立一個Win32 Application工程,然後選擇An empty Project(我用英文版的VC,建議你也換成英文版的),意思就是建立一個空的Win32工程,工程名字就叫bulkusb,點Finish.

第二步:

將C:\2003DDK\src\wdm\usb\bulkusb\sys(這里是驅動代碼,另一個exe里是用戶程序,不管它)里的所有文件拷貝到bulkusb工程目錄下。然後把.h,.c,.rc 導入到VC里對應的目錄裡面去。

第三步:

然後就是開始設置工程選項,把這些代碼編譯成sys了。 要編譯我們需要DDK,所以先要在vc的Tool->Options->Directories里設置一些路徑給VC調用(設置基本原則:要保證下面所有設置的路徑排在前面!)。

設置Include路徑:

C:\2003DDK\INC

C:\2003DDK\INC\CRT

C:\2003DDK\INC\WNET

C:\2003DDK\INC\DDK\WNET

C:\2003DDK\INC\DDK\WDM\WNET

要按這樣的順序添加。注意這里的WNET目錄了嗎?這就是2003最新頭文件,其實選擇wxp或者w2k目錄也是可以的,只是wnet里的頭文件最全,因為系統不斷進步,有些新的api只有新的頭文件里才有定義。當然最好是選擇對應的頭文件來編譯對應系統的驅動,但是我試過用wnet編譯的驅動在2000 下也能用,因為我們一般用不到那些新添加的 api.。

設置lib路徑:

C:\2003DDK\LIB

C:\2003DDK\LIB\CRT\I386

C:\2003DDK\LIB\WNET\I386 //wnet道理和上面一樣

設置Executable File:

C:\2003DDK\BIN\X86 //這就是編譯器的路徑,包含cl.exe,link.exe的目錄,由於我們要編譯32位驅動,所以把這個添加進去,放在第一項。

總的來說,只要設置好Include,Lib和編譯器,編譯什麼文件都沒問題的,你也可以自己嘗試安裝最新的2003SDK,編譯Win32應用程序成64位。

第四步:

開始進入工程設置,先設置C/C++,在Preprocesser definitions里輸入如下字串:

Release下輸入:

_X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,NDEBUG

Debug下輸入:

_X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,_DEBUG

在Code Generation里的Calling convention用__stdcall,(這是驅動程序必須的)

Debug版有個特殊編譯選項 /GZ (注意是大寫的,小寫的不要刪!)刪掉,否則有鏈接錯誤,chkesp鏈接不上什麼的。

第五步:

開始設置Link頁,將輸出文件名改為sys擴展名,

在General的Object/Library moles, 填入驅動所調用到的幾個lib:

ntoskrnl.lib hal.lib usbd.lib wmilib.lib。

然後進入Output在Entry-point symbol:

填DriverEntry

下面就是往Project Options手動增加一些鏈接選項,復制如下進去:

/machine:IX86 /driver /subsystem:native /SECTION:INIT,d /IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221

刪除如下選項:

/subsystem:windows

/machine代表目標機器類型,/driver代表驅動,/subsystem:native 也是代表驅動。

OK,大功告成,我們可以編譯32位驅動了!

那麼如果我們要編譯64位驅動呢? 這里大家注意一下,64位有兩種,一個是AMD64,一個是IA64,要選定你的目標平台,目前AMD64平台最為流行。

其實編譯成64位也很簡單,只要把32位的配置稍微改一下就行了,我們以編譯AMD64位驅動為例(你會復制VC的工程Configurations吧,把32位的Relase,Debug各復制一份改名為ReleaseAMD64和DebugAMD64,然後在復製品的基礎上修改):

1.要修改兩個lib路徑:

C:\2003DDK\LIB\CRT\I386改為:C:\2003DDK\LIB\CRT\amd64

C:\2003DDK\LIB\WNET\I386 改為:C:\2003DDK\lib\wnet\amd64

2.修改編譯器路徑:

C:\2003DDK\BIN\X86

改為:

C:\2003DDK\bin\win64\x86\amd64

C:\2003DDK\BIN\X86 //這句也要存在

3.修改C/C++里的Preprocesser definitions為:

ReleaseAMD64下輸入:

_AMD64_,AMD64,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,NDEBUG

DebugAMD64下輸入:

_AMD64_,AMD64,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,_DEBUG

4.需要修改link頁里的Project Options,手動改一下:將/machine:IX86改為:/machine:amd64

5.理論上到這里設置就OK了,不過還是有一個鏈接錯誤unresolved external symbol __security_cookie ,只要在鏈接的lib里加入bufferoverflowK.lib (為什麼是bufferoverflowK.lib?看這里:http://support.microsoft.com/kb/894573) 就可以了。我修改的工程範例下載:下載地址。

以上的設置大部分都可以保存在VC工程文件(*.dsp)里,除了設置的include路徑,lib路徑和編譯器路徑,這些路徑是全局的,在打開另一些工程也會留下了,就會給編譯應用程序帶來麻煩,還需要一個一個改回去,而目錄切換器就是為了快速切換這些路徑而開發的。

㈤ c語言高手進,深究一下extern的用法

整個編譯過程分編譯和鏈接兩部分。 編譯是以 .c文件為一個單元的, 也就是說, 編譯的時候編譯器每次就只關注這一個.c文件, 編譯的過程跟其它.c里寫了什麼毫無關系。 所以define語句不存在什麼作用域的問題, 寫在哪就在哪運行, 寫幾次就運行幾次。

另外就是理解#include的意義。 每本書都會講, #include就是把那個文件的內容替換到當前位置, 奇怪的是總有人覺得這裡面有什麼更神奇的東西存在。。。 #include就是替換,沒有別的 。所以每個.h裡面所有東西被編譯器看到都是在某個 .c裡面, 這時候這些語句就相當於是寫在.c里的語句。

然後就可以解釋你的問題。 UCOS.h裡面有一個extern聲明, 所以凡是include了它的.c裡面就都有這么個聲明, 有這個聲明就是告訴編譯器,某個地方有這東西, 你就用就行了。 所以就可以隨便用它

但是只有extern的聲明還不行, 因為畢竟這個東西需要在某個地方切實地實現它,否則編譯沒問題而鏈接是不可能過的。 所以就需要在某個.c里寫上它的實現。 為了簡單點完成這個而寫了#ifdef之類的東西, 就是想在定義了 _main的情況下寫它的實現, 而沒定義這個的情況下變成它的聲明。

㈥ C語言條件編譯的目的是防止重復定義,請問是防止單個文件內的重復定義還是一個工程中的重復定義

因為編譯的時候是按文件編譯的,所以是防止單個文件內重復定義。

㈦ C語言中的條件編譯問題

簡單點說,尖括弧的意思是要包含的文件是系統的,會優先在系統的包含路徑中去找,典型的像
<stdio.h>。雙引號的意思是用戶自己的頭文件,所以先在用戶指定的目錄中去找,然後再去系統的路徑內去找,比如"my.h"。
默認的路徑,用戶的頭文件默認放在與源文件相同的目錄下,比如my.c所在的目錄,或者系統的工程文件目錄,這一點不同的系統可以會有不同的規定。而系統的頭文件一般放在編譯器的安裝目錄下,可能需要用編譯系統規定的語法進行指定,比如 -I=C:\XXX\INCLUDE;這個語句一般在集成的編譯環境中可以進行配置,如果配置不好,就可以會大量的出現某某頭文件找不到的情況,當然,編譯系統安裝的時候,一般都會配置好的,很少需要用戶特意進行配置。
結論,尖括弧與雙引號沒有本質的區別,可以全部用雙引號。如果是系統的頭文件,用尖括弧會稍微快一點。但對現在的計算機系統來說,快得這一點,很有限。

㈧ Delphi的命令行編譯命令

Borland出品的Delphi,有著閃電般的編譯速度,但是在界面控制項使用較多、工程項目較大的時候,編譯一個工程仍需要一段時間,打開龐大的Delphi IDE,也需要時間。其實,在一個工程開發結束,調試完成之後的Release編譯,完全可以用命令行來執行,因為Delphi的編譯器參數不像C++編譯器那樣復雜。

筆者把Delphi聯機手冊中關於命令行編譯(command-line compiler)的幾篇主題作了翻譯,希望對Delphi開發人員有幫助。

目錄
1. Command-line compiler
命令行編譯器
2. Command-line compiler options
命令行編譯器選項
3. Compiler directive options
編譯器指令選項
4. Compiler mode options
編譯模式選項
5. DCC32.CFG file
編譯器配置文件DCC32.CFG
6. Debug options
調試選項
7. Directory options
目錄選項
8. IDE command-line options
IDE命令行選項
9. Generated files
幾個IDE自動生成的文件介紹

Command-line compiler
命令行編譯器
Delphi's command-line compiler (dcc32.EXE) lets you invoke all the functions of the IDE compiler (DELPHI32.EXE) from the DOS command line (see IDE command-line options. Run the command-line compiler from the DOS prompt using the syntax:
Delphi』s命令行編譯器(dcc32.exe)允許你從DOS命令行方式(參照:IDE命令行選項)實現IDE編譯器(delphi32.exe)的所有功能。用DOS命令運行命令行編譯器語法如下:
dcc32 [options] filename [options]
dcc32 [選項] [文件名] [選項]
where options are zero or more parameters that provide information to the compiler and filename is the name of the source file to compile. If you type dcc32 alone, it displays a help screen of command-line options and syntax.
零或多個參數給編譯器提供信息,文件名指定需要編譯的源文件名。如果你單獨輸入dcc32,它會顯示一個關於命令行編譯的選項和語法的屏幕。
If filename does not have an extension, the command-line compiler assumes .dpr, then .pas, if no .dpr is found. If the file you're compiling to doesn't have an extension, you must append a period (.) to the end of the filename.
如果文件名沒有擴展名,命令行編譯器會查找擴展名為.dpr的同名文件,如果找不到,則查找擴展名為.pas的同名文件。如果你的源文件確實沒有擴展名,你需要在文件名的末尾添加(.)。
If the source text contained in filename is a program, the compiler creates an executable file named filename.EXE. If filename contains a library, the compiler creates a file named filename.DLL. If filename contains a package, the compiler creates a file named filename.BPL. If filename contains a unit, the compiler creates a unit file named filename.dcu.
如果指定的源文件是一個工程文件,編譯器會創建一個擴展名為.EXE的同名可執行文件。如果指定的源文件是一個庫文件,編譯器創建一個擴展名為.DLL的同名動態鏈接庫文件。如果指定的源文件是一個包文件,編譯器會創建一個擴展名為.BPL的同名包。如果指定的源文件是一個單元文件,編譯器會創建一個擴展名為.dcu的目標代碼文件。
You can specify a number of options for the command-line compiler. An option consists of a slash (/) or immediately followed by an option letter. In some cases, the option letter is followed by additional information, such as a number, a symbol, or a directory name. Options can be given in any order and can come before or after the file name.
你可以為命令行編譯器指定多個參數。一個參數包含一個破折號「-」(或「/」)和緊跟著的一個選項字元構成。通常情況下,選項字元後面會跟一些附加的信息,如一個數字、一個符號、一個目錄等。選項可以是任意順序並且可以在源文件名前面或後面。

Command-line compiler options
命令行編譯選項
The IDE lets you set various options through the menus; the command-line compiler gives you access to these options using the slash (/) delimiter. You can also precede options with a hyphen (-) instead of a slash (/), but those options that start with a hyphen must be separated by blanks. For example, the following two command lines are equivalent and legal:
IDE允許你使用菜單來設置各種編譯選項,而命令行編譯器允許你使用字元「/」作為分隔符來設定這些編譯選項。你也可以使用連字元「-」來代替「/」,但是用「-」引出的參數之間必須用空格隔開。例如,下面兩個命令都是等同的也是合法的:
DCC -IC:\DELPHI -DDEBUG SORTNAME -$R- -$U+
DCC /IC:\DELPHI/DDEBUG SORTNAME /$R-/$U+
The first command line uses hyphens with at least one blank separating options. The second uses slashes and no separation is needed.
第一個編譯命令用「-」引出參數,且參數之間有多個空格分隔。第二個編譯命令用「/」引出參數,參數之間不必要分隔。
The following table lists the command-line options. In addition to the listed options, all single-letter compiler directives can be specified on the command line, as described in Compiler directive options.
下列表中列出所有的命令行參數。在附加的選項列表中,所有的單字元編譯器指令都可以在命令行編譯中使用,詳情請參照:編譯器指令。
Option Description
選項 描述
Aunit=alias 設置單元別名
B 編譯所有單元
CC 編譯控制台程序
CG 編譯圖形界面程序
Ddefines 編譯條件符號定義
Epath 可執行文件輸出路徑
Foffset 查找運行期間錯誤
GD 生成完整.Map文件
GP 生成.Map文件Public段
GS 生成.Map文件Segment段
H 輸出提示信息
Ipaths 文件包含路徑
J 生成.Obj目標文件
JP 生成C++類型.Obj目標文件
Kaddress Set image base address
LEpath 包.BPL文件輸出路徑
LNpath .dcp文件輸出路徑
LUpackage 使用運行期間包列表
M 編譯有改動的源文件
Npath dcu/dpu文件輸出目錄
Opaths .Obj文件(匯編目標代碼文件)路徑
P 按8.3格式文件名查找
Q 安靜模式
Rpaths 資源文件(.RES)路徑
TXext 目標文件擴展名
Upaths 單元文件路徑
V 為Turbo Debugger生成調試信息文件
VN 以.Giant格式生成包含命名空間的調試信息文件(將用於C++Builder)
VR 生成調試信息文件.rsm
W 輸出警告信息
Z Disable implicit compilation
$directive Compiler directives
--Help 顯示編譯選項的幫助。同樣的,如果你在命令行單獨輸入dcc32,也會顯示編譯選項的幫助。
--version 顯示產品名稱和版本

Compiler directive options
編譯器指令選項
Delphi supports the compiler directives described in Compiler directives. The $ and D command-line options allow you to change the default states of most compiler directives. Using $ and D on the command line is equivalent to inserting the corresponding compiler directive at the beginning of each source file compiled.
Delphi支持用編譯器指令關鍵字描述的編譯器指令。使用「$」和「D」命令行選項可以改變所有的默認編譯器狀態。用「$」和「D」命令行選項等同於在源文件的前面添加編譯器指令。
Switch directive option
編譯器指令選項開關
The $ option lets you change the default state of all of the switch directives. The syntax of a switch directive option is $ followed by the directive letter, followed by a plus (+) or a minus (-). For example:
「$」允許你改變每一種編譯器指令默認狀態。編譯器指令的語法是「$」後緊跟一個指令字元,再跟一個「-」或「+」。例如:
dcc32 MYSTUFF -$R-
compiles MYSTUFF.pas with range-checking turned off, while:
不使用邊界檢查編譯MYSTUFF.pas單元:
dcc32 MYSTUFF -$R+
compiles it with range checking turned on. Note that if a {$R+} or {$R-} compiler directive appears in the source text, it overrides the -$R command-line option.
使用界面檢查編譯MYSTUFF.pas單元。如果將編譯器指令{$R+}或{$R-}添加到源文件的開始,它將覆蓋從命令行傳入的參數。
You can repeat the -$ option in order to specify multiple compiler directives:
你可以用多個「$」來指定多個編譯器指令,如:
dcc32 MYSTUFF -$R--$I--$V--$U+
Alternately, the command-line compiler lets you write a list of directives (except for $M), separated by commas:
命令行編譯器允許作用逗號分隔的編譯器指定列表,如:
dcc32 MYSTUFF -$R-,I-,V-,U+
只需要用一個「$」符號。
Only one dollar sign ($) is needed.
注意,因為$M的格式不一樣,你不能在逗號分隔的指令列表中使用$M
Note that, because of its format, you cannot use the $M directive in a list of directives separated by commas.
Conditional defines option
條件編譯選項
The -D option lets you define conditional symbols, corresponding to the {$DEFINE symbol} compiler directive. The -D option must be followed by one or more conditional symbols separated by semicolons (;). For example, the following command line:
「-D」選項允許你定義一個編譯條件,符合你用{$DEFINE symbol}定義的編譯器指令。「-D」選項後必須跟隨一或多個用分號分隔的編譯條件符號,如下命令:
dcc32 MYSTUFF -DIOCHECK;DEBUG;LIST
defines three conditional symbols, iocheck, debug, and list, for the compilation of MYSTUFF.pas. This is equivalent to inserting:
定義了三個編譯條件符號:IOCHECK,DEBUG,LIST,用於MYSTUFF.pas單元中。這等同於在源文件中插入以下語句:
{$DEFINE IOCHECK}
{$DEFINE DEBUG}
{$DEFINE LIST}
at the beginning of MYSTUFF.pas. If you specify multiple -D directives, you can concatenate the symbol lists. Therefore:
如果你指定了多個「-D」選項,你可以聯接它們,如下:
dcc32 MYSTUFF -DIOCHECK-DDEBUG-DLIST

is equivalent to the first example.
等同於第一個例子。

Compiler mode options
編譯模式選項
A few options affect how the compiler itself functions. As with the other options, you can use these with either the hyphen or the slash format. Remember to separate the options with at least one blank.
有幾個選項能影響編譯器自身的功能。像其它選項一個,你可以使用「/」或「-」的格式。別忘了用至少一個空格分隔這些選項。
Make (-M) option
選項(-M)
The command-line compiler has built-in MAKE logic to aid in project maintenance. The -M option instructs command-line compiler to check all units upon which the file being compiled depends. Using this option results in a much quicker compile time.
命令行編譯器使用構造邏輯的方式來維護工程。「-M」選項指示編譯器檢查所有與編譯文件相關聯的文件。用這個參數會導致編譯時間增大。
A unit is recompiled under the following conditions:
一個源文件在下列情況下會重新編譯:
The source file for that unit has been modified since the unit file was created.
源文件被創建以來被修改過;
用「$I」指令包含的任何文件,用「$L」包含的任何.Obj文件,或用「$R」關聯的任何資源文件.Res,比源文件中的要新;
Any file included with the $I directive, any .OBJ file linked in by the $L directive, or any .res file referenced by the $R directive, is newer than the unit file.
The interface section of a unit referenced in a uses statement has changed.
單元介面部分interface的uses段有改動。
Units compiled with the -Z option are excluded from the make logic.
在單元編譯時指令「-Z」在構造邏輯期不被接受。
If you were applying this option to the previous example, the command would be:
如果你在上一個例子中使用這個指令,編譯命令就應該是:
dcc32 MYSTUFF -M
Build all (-B) option
編譯所有 選項(-B)
Instead of relying on the -M option to determine what needs to be updated, you can tell command-line compiler to update all units upon which your program depends using the -B option. You can't use -M and -B at the same time. The -B option is slower than the -M option and is usually unnecessary.
用於取代要知道哪些單元需要更新-M的選項,你可以使用-B選項來更新所有你的程序中關聯的單元。你不能在程序中同時使用-M和-B。選項-B比-M速度更慢,而且它並不是必需的。
If you were using this option in the previous example, the command would be
如果你在前一個例子中使用這個參數,編譯命令就應該是:
dcc32 MYSTUFF -B
Find error (-F) option
查找錯誤 選項(-F)
When a program terminates e to a runtime error, it displays an error code and the address at which the error occurred. By specifying that address in a -Faddress option, you can locate the statement in the source text that caused the error, provided your program and units were compiled with debug information enabled (via the $D compiler directive).
當一個程序由於運行期間錯誤而終止時,它會顯示一個錯誤號和錯誤地址在錯誤發生時。用-Faddress選項來指定錯誤地址,你在源文件中能找到引發錯誤的位置,如果你的程序和單元編譯時附加了調試信息(使用$D編譯器指令)。
In order for the command-line compiler to find the runtime error with -F, you must compile the program with all the same command-line parameters you used the first time you compiled it.
為了命令行編譯器能用-F選項查找運行期間錯誤,你必須傳遞與第一次編譯時相同的指令列表。
As mentioned previously, you must compile your program and units with debug information enabled for the command-line compiler to be able to find runtime errors. By default, all programs and units are compiled with debug information enabled, but if you turn it off, using a {$D-} compiler directive or a -$D- option, the command-line compiler will not be able to locate runtime errors.
先前提到過,你的程序和單元必須啟用調試信息,命令行編譯器才能查找運行期間錯誤。默認情況下,所有的程序和單都是啟用調試信息的,除非你用{-D}或-$D-指令關閉它,這樣,命令行編譯器就不能查找運行期間錯誤了。
Use packages (-LU) option
使用包(-LU)選項
Use the -LU option to list additional runtime packages that you want to use in the application being compiled. Runtime packages already listed in the Project Options dialog box need not be repeated on the command line.
使用-LU選項來在編譯時添加你應用程序中要用到的運行期間包。運行期間包已經在「工程選項」對話框中列舉的,不必再在命令行中添加。
Disable implicit compilation (-Z) option
(此選項在delphi6.0/7.0中有不同描述,在此不作翻譯)
The -Z option prevents packages and units from being implicitly recompiled later. With packages, it is equivalent to placing {$ IMPLICITBUILD OFF} in the .dpk file. Use -Z when compiling packages that provide low-level functionality, that change infrequently between builds, or whose source code will not be distributed.
Target file extension (-TX) option
目標文件擴展名(-TX)選項
The -TX option lets you override the default extension for the output file. For example,
選項-TX允許你改寫默認的輸出文件擴展名。例如:
dcc32 MYSTUFF -TXSYS
generates compiled output in a file called MYSTUFF.SYS.
生成的將是一個叫做MYSTUFF.SYS的文件。
Quiet (-Q) option
安靜模式(-Q)選項
The quiet mode option suppresses the printing of file names and line numbers ring compilation. When the command-line compiler is invoked with the quiet mode option
安靜模式選項禁止在編譯時顯示文件名及代碼行數,如果命令行編譯器調用這個選項的話。
dcc32 MYSTUFF -Q its output is limited to the startup right message and the usual statistics at the end of compilation. If any errors occur, they will be reported.

它的輸出僅限於起始時行版權信息以及結尾的統計信息。當然,如果發生錯誤,它也會輸出。

DCC32.CFG file
DCC32.CFG配置文件
You can set up a list of options in a configuration file called DCC32.CFG, which will then be used in addition to the options entered on the command line. Each line in configuration file corresponds to an extra command-line argument inserted before the actual command-line arguments. Thus, by creating a configuration file, you can change the default setting of any command-line option.
你可以設置一個編譯選項列表到一個叫做DCC32.CFG的配置文件中,它將用於編譯時附加到命令行參數後。配置文件的每一行都相當於一個額外的命令行參數插入到實際的命令行參數前(注意,是實際參數前)。因而,你可以使用這個配置文件改變一些命令行參數的默認設置。
The command-line compiler lets you enter the same command-line option several times, ignoring all but the last occurrence. This way, even though you've changed some settings with a configuration file, you can still override them on the command line.
命令行編譯器允許你輸入相同的命令行參數,它將忽略所有除最後一個之外。這個的話,盡管通過配置文件你可以改變一些設置,你仍然可以覆蓋它使用命令行參數。
When dcc32 starts, it looks for DCC32.CFG in the current directory. If the file isn't found there, dcc32 looks in the directory where DCC32.EXE resides.
當dcc32啟動時,它查找DCC32.CFG文件在當前目錄。如果文件沒有找到,dcc32會查找它所在的目錄。
Here's an example DCC32.CFG file, defining some default directories for include, object, and unit files, and changing the default states of the $O and $R compiler directives:
以下是一個DCC32.CFG配置文件的例子,定義了關於文件包含、OBJ文件包含、單元文件搜索路徑信息,並改變了編譯器指令$O和$R的默認值。
-IC:\DELPHI\INC;C:\DELPHI\SRC
-OC:\DELPHI\ASM
-UC:\DELPHI\UNITS
-$R+
-$O-
Now, if you type:
現在,如果你輸入:
dcc32 MYSTUFF
the compiler performs as if you had typed the following:
編譯器把它當作你輸入如下命令:
dcc32 -IC:\DELPHI\INC;C:\DELPHI\SRC -OC:\DELPHI\ASM -UC:\DELPHI\UNITS -$R+ -$O- MYSTUFF

Debug options
調試選項
The compiler has two sets of command-line options that enable you to generate external debugging information: the map file options and the debug info options.
編譯器有兩個命令行參數可以生成外部調試信息:MAP文件選項和調試信息選項。
Map file (-G) options
Map文件(-G)選項
The -G option instructs the command-line compiler to generate a .map file that shows the layout of the executable file. Unlike the binary format of executable and .dcu files, a .map file is a legible text file that can be output on a printer or loaded into the editor. The -G option must be followed by the letter S, P, or D to indicate the desired level of information in the .map file. A .MAP file is divided into three sections:
選項-G指示命令行編譯器生成一個.map文件來查看一個可執行文件的布局。不同於可二進制的可執行文件和.dcu文件,.map文件是一個可讀的文本文件,可以被列印或是其它文本編輯器編輯。選項-G後必須跟字元S、P或D,去決定你想要在.map文件列出的信息。一個.MAP文件被分成三個節:
Segment
Publics
Line Numbers
-GS outputs only the Segment section, -GP outputs the Segment and Publics section, and -GD outputs all three sections. -GD also generates a .DRC file that contains tables of all string constants declared using the resourcestring keyword.
-GS選項只輸出Segment Section,-GS選項輸出Segment和Publics,-GD輸出所有的三個Sections.-GD選項也生成一個擴展名為.DRC的文件包含所有的用resourcestring關鍵字聲明的字元串常量。
For moles (program and units) compiled in the {$D+,L+} state (the default), the Publics section shows all global variables, proceres, and functions, and the Line Numbers section shows line numbers for all proceres and functions in the mole. In the {$D+,L-} state, only symbols defined in a unit's interface part are listed in the Publics section. For moles compiled in the {$D-} state, there are no entries in the Line Numbers section.
用默認的編譯選項{$D+,L+}編譯模塊(程序或單元),Publics Section列舉所有的全局變數、過程和函數,Line Numbers Section列舉模塊中所有的過程和函數的行號。如果用{$D+,L-}編譯選項編譯模塊,Publics Section中僅列舉在單元的interface部分定義的符號。如果用{$D-}選項編譯模塊,在Line Numbers Section沒有任何入口。
Debug info (-V) options
調度選項(-V)
The -V options (-V, -VN. and -VR), which cause the compiler to generate debug information, can be combined on the command line.
選項-V、-VN、-VR會指示編譯器生成調試信息,它們能在命令行中組合使用。
Generate Turbo Debugger debug info (-V) option
生成Turbo Debugger使用的調試信息的選項(-V)
When you specify the -V option on the command line, the compiler appends Turbo Debugger 5.0-compatible external debug information at the end of the executable file. Turbo Debugger includes both source- and machine-level debugging and powerful breakpoints.
當你在命令行中使用-V選項時,編譯器會在可執行文件的末尾附加與Turbo Debugger5.0一致的外部調試信息。Turbo Debugger包含代碼和硬體級別的強大的斷點。
Even though the debug information generated by -V makes the resulting executable file larger, it does not affect the actual code in the executable, and does not require additional memory to run the program.
雖然附加調試信息到查執行文件中會使可執行文件增大,但是它並不影響實際可執行文件中的可執行代碼,也不需要額外的內存來啟動程序。
The extent of debug information appended to the executable file depends on the setting of the $D and $L compiler directives in each of the moles (program and units) that make up the application. For moles compiled in the {$D+,L+} state, which is the default, all constant, variable, type, procere, and function symbols are known to the debugger. In the {$D+,L-} state, only symbols defined in a unit's interface section are known to the debugger. In the {$D-} state, no line-number records are generated, so the debugger cannot display source lines whe

㈨ Debug編譯通過,Release編譯報錯,為什麼

對照這些選項看看 Release 版錯誤是怎樣產生的

1. Runtime Library:鏈接哪種運行時刻函數庫通常只對程序的性能產生影響。調試版本的 Runtime Library 包含了調試信息,並採用了一些保護機制以幫助發現錯誤,因此性能不如發布版本。編譯器提供的 Runtime Library 通常很穩定,不會造成 Release 版錯誤;倒是由於 Debug 的 Runtime Library 加強了對錯誤的檢測,如堆內存分配,有時會出現 Debug 有錯但 Release 正常的現象。應當指出的是,如果 Debug 有錯,即使 Release 正常,程序肯定是有 Bug 的,只不過可能是 Release 版的某次運行沒有表現出來而已。

2. 優化:這是造成錯誤的主要原因,因為關閉優化時源程序基本上是直接翻譯的,而打開優化後編譯器會作出一系列假設。這類錯誤主要有以下幾種:

(1) 幀指針(Frame Pointer)省略(簡稱 FPO ):在函數調用過程中,所有調用信息(返回地址、參數)以及自動變數都是放在棧中的。若函數的聲明與實現不同(參數、返回值、調用方式),就會產生錯誤 ————但 Debug 方式下,棧的訪問通過 EBP 寄存器保存的地址實現,如果沒有發生數組越界之類的錯誤(或是越界「不多」),函數通常能正常執行;Release 方式下,優化會省略 EBP 棧基址指針,這樣通過一個全局指針訪問棧就會造成返回地址錯誤是程序崩潰。C++ 的強類型特性能檢查出大多數這樣的錯誤,但如果用了強制類型轉換,就不行了。你可以在 Release 版本中強制加入 /Oy- 編譯選項來關掉幀指針省略,以確定是否此類錯誤。此類錯誤通常有:

● MFC 消息響應函數書寫錯誤。正確的應為
afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);
ON_MESSAGE 宏包含強制類型轉換。防止這種錯誤的方法之一是重定義 ON_MESSAGE 宏,把下列代碼加到 stdafx.h 中(在#include "afxwin.h"之後),函數原形錯誤時編譯會報錯
#undef ON_MESSAGE
#define ON_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_lwl, \
(AFX_PMSG)(AFX_PMSGW)(static_cast< LRESULT (AFX_MSG_CALL \
CWnd::*)(WPARAM, LPARAM) > (&memberFxn) },

(2) volatile 型變數:volatile 告訴編譯器該變數可能被程序之外的未知方式修改(如系統、其他進程和線程)。優化程序為了使程序性能提高,常把一些變數放在寄存器中(類似於 register 關鍵字),而其他進程只能對該變數所在的內存進行修改,而寄存器中的值沒變。如果你的程序是多線程的,或者你發現某個變數的值與預期的不符而你確信已正確 的設置了,則很可能遇到這樣的問題。這種錯誤有時會表現為程序在最快優化出錯而最小優化正常。把你認為可疑的變數加上 volatile 試試。

(3) 變數優化:優化程序會根據變數的使用情況優化變數。例如,函數中有一個未被使用的變數,在 Debug 版中它有可能掩蓋一個數組越界,而在 Release 版中,這個變數很可能被優化調,此時數組越界會破壞棧中有用的數據。當然,實際的情況會比這復雜得多。與此有關的錯誤有:
● 非法訪問,包括數組越界、指針錯誤等。例如
void fn(void)
{
int i;
i = 1;
int a[4];
{
int j;
j = 1;
}
a[-1] = 1;//當然錯誤不會這么明顯,例如下標是變數
a[4] = 1;
}
j 雖然在數組越界時已出了作用域,但其空間並未收回,因而 i 和 j 就會掩蓋越界。而 Release 版由於 i、j 並未其很大作用可能會被優化掉,從而使棧被破壞。

3. _DEBUG 與 NDEBUG :當定義了 _DEBUG 時,assert() 函數會被編譯,而 NDEBUG 時不被編譯。除此之外,VC++中還有一系列斷言宏。這包括:

ANSI C 斷言 void assert(int expression );
C Runtime Lib 斷言 _ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
MFC 斷言 ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );
ATL 斷言 ATLASSERT( booleanExpression );
此外,TRACE() 宏的編譯也受 _DEBUG 控制。

所有這些斷言都只在 Debug版中才被編譯,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事實上,這些宏都是調用了 assert() 函數,只不過附加了一些與庫有關的調試代碼。如果你在這些宏中加入了任何程序代碼,而不只是布爾表達式(例如賦值、能改變變數值的函數調用 等),那麼 Release 版都不會執行這些操作,從而造成錯誤。初學者很容易犯這類錯誤,查找的方法也很簡單,因為這些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用這些宏的地方再一一檢查即可。另外,有些高手可能還會加入 #ifdef _DEBUG 之類的條件編譯,也要注意一下。
順便值得一提的是 VERIFY() 宏,這個宏允許你將程序代碼放在布爾表達式里。這個宏通常用來檢查 Windows API 的返回值。有些人可能為這個原因而濫用 VERIFY() ,事實上這是危險的,因為 VERIFY() 違反了斷言的思想,不能使程序代碼和調試代碼完全分離,最終可能會帶來很多麻煩。因此,專家們建議盡量少用這個宏。

4. /GZ 選項:這個選項會做以下這些事

(1) 初始化內存和變數。包括用 0xCC 初始化所有自動變數,0xCD ( Cleared Data ) 初始化堆中分配的內存(即動態分配的內存,例如 new ),0xDD ( Dead Data ) 填充已被釋放的堆內存(例如 delete ),0xFD( deFencde Data ) 初始化受保護的內存(debug 版在動態分配內存的前後加入保護內存以防止越界訪問),其中括弧中的詞是微軟建議的助記詞。這樣做的好處是這些值都很大,作為指針是不可能的(而且 32 位系統中指針很少是奇數值,在有些系統中奇數的指針會產生運行時錯誤),作為數值也很少遇到,而且這些值也很容易辨認,因此這很有利於在 Debug 版中發現 Release 版才會遇到的錯誤。要特別注意的是,很多人認為編譯器會用 0 來初始化變數,這是錯誤的(而且這樣很不利於查找錯誤)。
(2) 通過函數指針調用函數時,會通過檢查棧指針驗證函數調用的匹配性。(防止原形不匹配)
(3) 函數返回前檢查棧指針,確認未被修改。(防止越界訪問和原形不匹配,與第二項合在一起可大致模擬幀指針省略 FPO )

通常 /GZ 選項會造成 Debug 版出錯而 Release 版正常的現象,因為 Release 版中未初始化的變數是隨機的,這有可能使指針指向一個有效地址而掩蓋了非法訪問。

除此之外,/Gm /GF 等選項造成錯誤的情況比較少,而且他們的效果顯而易見,比較容易發現。
--------------------------------------------------------------
Release是發行版本,比Debug版本有一些優化,文件比Debug文件小
Debug是調試版本,包括的程序信息更多
Release方法:
build->batch build->build就OK.

具體可以看看下面的鏈接
參考資料: http://hi..com/msingle/blog/item/57e8c8fb8fa294214f4aeaa8.html

㈩ 動態鏈接庫怎樣條件編譯

project setting 中進行編譯參數設置, 自己可以試試,

熱點內容
海瀾之家廣告腳本 發布:2025-05-17 13:56:06 瀏覽:30
手文件夾恢復 發布:2025-05-17 13:53:32 瀏覽:993
linux怎麼看進程 發布:2025-05-17 13:53:30 瀏覽:303
thinkphp欄位緩存 發布:2025-05-17 13:52:01 瀏覽:575
山靈app安卓版如何設置 發布:2025-05-17 13:51:49 瀏覽:388
帆布壓縮袋 發布:2025-05-17 13:26:27 瀏覽:457
c語言16進製表示方法 發布:2025-05-17 13:11:25 瀏覽:480
ftp單位 發布:2025-05-17 13:10:03 瀏覽:142
c語言編寫n的階乘 發布:2025-05-17 13:10:02 瀏覽:685
lockjava 發布:2025-05-17 13:02:08 瀏覽:312