A. Linux 編譯選項
gcc -E source_file.c
-E,只執行到預編譯。直接輸出預編譯結果。
gcc -S source_file.c
-S,只執行到源代碼到匯編代碼的轉換,輸出匯編代碼。
gcc -c source_file.c
-c,只執行到編譯,輸出目標文件。
gcc (-E/S/c/) source_file.c -o output_filename
-o, 指定輸出文件名,可以配合以上三種標簽使用。
-o 參數可以被省略。這種情況下編譯器將使用以下默認名稱輸出:
-E:預編譯結果將被輸出到標准輸出埠(通常是顯示器)
-S:生成名為source_file.s的匯編代碼
-c:生成名為source_file.o的目標文件。
無標簽情況:生成名為a.out的可執行文件。
gcc -g source_file.c
-g,生成供調試用的可執行文件,可以在gdb中運行。由於文件中包含了調試信息因此運行效率很低,且文件也大不少。
這里可以用strip命令重新將文件中debug信息刪除。這是會發現生成的文件甚至比正常編譯的輸出更小了,這是因為strip把原先正常編譯中的一些額外信息(如函數名之類)也刪除了。用法為 strip a.out
gcc -s source_file.c
-s, 直接生成與運用strip同樣效果的可執行文件(刪除了所有符號信息)。
gcc -O source_file.c
-O(大寫的字母O),編譯器對代碼進行自動優化編譯,輸出效率更高的可執行文件。
-O 後面還可以跟上數字指定優化級別,如:
gcc -O2 source_file.c
數字越大,越加優化。但是通常情況下,自動的東西都不是太聰明,太大的優化級別可能會使生成的文件產生一系列的bug。一般可選擇2;3會有一定風險。
gcc -Wall source_file.c
-W,在編譯中開啟一些額外的警告(warning)信息。-Wall,將所有的警告信息全開。
gcc source_file.c -L/path/to/lib -lxxx -I/path/to/include
-l, 指定所使用到的函數庫,本例中鏈接器會嘗試鏈接名為libxxx.a的函數庫。
-L,指定函數庫所在的文件夾,本例中鏈接器會嘗試搜索/path/to/lib文件夾。
-I, 指定頭文件所在的文件夾,本例中預編譯器會嘗試搜索/path/to/include文件夾。
B. MDK編譯選項怎麼改成--cpu
<script type="text/javascript">
Leaf leaf = new Leaf("Leaf D");
root.Add(leaf);
root.Remove(leaf);
root.Display(1);
Console.Read();
}
C. 條件編譯選項 什麼意思
一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件下才進行編譯,即對一部分內容指定編譯條件,這就是「條件編譯」。(conditional compile) 條件編譯語句排版時,需考慮以下三種位置: (1)條件編譯語句塊與函數定義體之間不存在相互嵌套(主要在(.h)文件中) ◆ 條件編譯關鍵字語句頂格左對齊; ◆ 所含的#include語句(塊) #define語句(塊)甚至是被嵌套下級條件編譯語句塊,按照語句塊嵌套的排版方式進行縮進排版 。 (2)條件編譯語句塊嵌套在函數體之外(主要在(.c)文件中) 這種情況下,條件編譯語句塊不影響函數體 ◆ 條件編譯關鍵字語句頂格左對齊; ◆ 所含的函數體定義無需縮進,依舊按照單個函數體定義的排版方式進行。 (3)條件編譯語句嵌套在函數體內 (主要在(.c)文件中) a)當條件編譯語句塊與被包語句所屬的語句塊之間沒有邏輯路徑交叉時,以下兩種方式均可 ◆ 按照語句塊嵌套方式進行縮進排版 (推薦); ◆ 條件編譯語句不影響原先語句塊排版,條件編譯語句與所包含的關鍵字語句塊左對齊 。 b)當條件編譯語句塊與被包語句所屬的語句塊之間存在邏輯路徑交叉時 ◆ 條件編譯語句頂格左對齊,其它語句按照正常順序排版。 條件編譯的形式如下所示(NNN、MMM等都是在某處已經定義為 1 或者 0 的): #if NNN statement1; #elif MMM statement2; #else statement3; #endif 條件編譯指令將決定那些代碼被編譯,而哪些是不被編譯的。可以根據表達式的值或者某個特定的宏是否被定義來確定編譯條件。 1.#if指令 #if指令檢測跟在製造另關鍵字後的常量表達式。如果表達式為真,則編譯後面的代碼,直到出現#else、#elif或#endif為止;否則就不編譯。 2.#endif指令 #endif用於終止#if預處理指令。 #define DEBUG 0 main() { #if DEBUG printf("Debugging\n"); #endif printf("Running\n"); } 由於程序定義DEBUG宏代表0,所以#if條件為假,不編譯後面的代碼直到#endif,所以程序直接輸出Running。 如果去掉#define語句,效果是一樣的。 3.#ifdef和#ifndef #define DEBUG main() { #ifdef DEBUG printf("yes\n"); #endif #ifndef DEBUG printf("no\n"); #endif } #if defined等價於#ifdef; #if !defined等價於#ifndef 4.#else指令 #else指令用於某個#if指令之後,當前面的#if指令的條件不為真時,就編譯#else後面的代碼。#endif指令將中指上面的條件塊。 #define DEBUG main() { #ifdef DEBUG printf("Debugging\n"); #else printf("Not debugging\n"); #endif printf("Running\n"); } 5.#elif指令 #elif預處理指令綜合了#else和#if指令的作用。 #define TWO main() { #ifdef ONE printf("1\n"); #elif defined TWO printf("2\n"); #else printf("3\n"); #endif } 程序很好理解,最後輸出結果是2。 6.其他一些標准指令 #error指令將使編譯器顯示一條錯誤信息,然後停止編譯。 #line指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。 #pragma指令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息
D. C語言編譯器會編譯改變過的代碼,而不會編譯沒有改動的代碼。 我想知道它是怎麼判斷程序是否有唄修改過的
編譯器要記錄你的編譯生成文件,比如obj、exe等的生成日期,發現與相關的文件如.c源文件、obj等日期舊時則選擇對此部分重新編譯。
特別地,它記錄所有相關文件,比如你新修改了某頭文件.h,編譯系統會逐一比較所有使用這個.h文件的編譯結果,如果發現時間舊了就重新編譯它們。
E. C++中Release版本和DEBUG版本編譯選項差別的問題。
你是不是有變數沒有初始化或者用了諸如i=i++ + ++i這種未定義行為!這兩種情況必須考慮!盡量別去考慮debug和release的內存分配方式!
F. vivox6系統升級後版本信息里的編譯時間怎麼會變
編譯時間是手機系統軟體版本更新的時間,這是正常現象的,還請放心使用。
G. devc++為什麼代碼改變編譯運行卻沒變
額……不是很懂題主的問題,是否可以詳細說明
1,如果你修改的是注釋的話,編譯運行自然是不變
2,根據不同的代碼,需要看你修改的是哪一部分,例如修改的是不需要用到的部分,運行結果也不會變
H. 如何設置編譯選項 ubuntu
這個就要看你的具體的編譯器了。例如:在 UBUNTU 系統下,使用的是 gcc C 語言編譯器,那麼就一定要遵循 gcc 的編譯選項規定。例如:gcc myfile.c,該命令產生的是一個預設的輸出運行文件 a.out;gcc -o myrunfile myfile.c,該命令將會產生一個輸出文件為 myrunfile 的運行文件;gcc -c myfile.c,該命令是只產生一個 myfile.o 的中間文件,只編譯、不連接。除此之外,你還需要注意 makefile 文件的編寫規則,因為該文件才是真正要把所有的源程序的編譯選項按照一定的規則寫到 makefile 文件中,然後再整體對源程序進行編譯、連接。
I. 為什麼有時編譯選項要改成多線程才能編譯通過,而 單線程就不行呢
主要是libc(C函數)庫不同,有時鏈接時會看到libcd.lib/libc.lib/libcmt.lib...這些東東,就是針對不同的線程環境所使用的。不過在VS2005之後,不再使用單線程庫了,它只使用libc*mt.lib,也就是有很多老程序代碼在VS2005下找不到LIBCD.lib的原因。
如果你在程序中使用了_beginthread之類的函數,那麼就會鏈接到多線程的c函數庫,單線程選項當然不能使用了。
而使用FORCE:MUTIPLE和這個沒有多大關系,它可能在同時使用了單線程庫和多線程庫時起到了忽略多個重疊符號錯誤的作用。