Last active
October 27, 2024 19:40
-
-
Save idhowardgj94/9a3a523e66f04ca87c3c41fa691128c5 to your computer and use it in GitHub Desktop.
GCC 指令
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
``` | |
轉自網路文章,原文已被刪除 | |
``` | |
email:[email protected] | |
[版本] -0.13 | |
[介紹] | |
gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工作的時候,總共需要4步 | |
1.預處理,生成.i的文件[預處理器cpp] | |
2.將預處理後的文件不轉換成彙編語言,生成文件.s[編譯器egcs] | |
3.有彙編變為目標代碼(機器代碼)生成.o的文件[彙編器as] | |
4.連接目標代碼,生成可執行程序[鏈接器ld] | |
[參數詳解] | |
-x language filename | |
設定文件所使用的語言,使後綴名無效,對以後的多個有效.也就是根據約定C語言的後綴名稱是.c的,而C++的後綴名是.C或者.cpp,如果你很個性,決定你的C代碼文件的後綴名是.pig 哈哈,那你就要用這個參數,這個參數對他後面的文件名都起作用,除非到了下一個參數的使用。 | |
可以使用的參數嗎有下面的這些 | |
`c`, `objective-c`, `c-header`, `c++`, `cpp-output`, `assembler`, and `assembler-with-cpp`. | |
看到英文,應該可以理解的。 | |
例子用法: | |
gcc -x c hello.pig | |
-x none filename | |
關掉上一個選項,也就是讓gcc根據文件名後綴,自動識別文件類型 | |
例子用法: | |
gcc -x c hello.pig -x none hello2.c | |
-c | |
只激活預處理,編譯,和彙編,也就是他只把程序做成obj文件 | |
例子用法: | |
gcc -c hello.c | |
他將生成.o的obj文件 | |
-S | |
只激活預處理和編譯,就是指把文件編譯成為彙編代碼。 | |
例子用法 | |
gcc -S hello.c | |
他將生成.s的彙編代碼,你可以用文本編輯器察看 | |
-E | |
只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件裡面. | |
例子用法: | |
gcc -E hello.c >; pianoapan.txt | |
gcc -E hello.c | more | |
慢慢看吧,一個hello word 也要與處理成800行的代碼 | |
-o | |
制定目標名稱,缺省的時候,gcc 編譯出來的文件是a.out,很難聽,如果你和我有同感,改掉它,哈哈 | |
例子用法 | |
gcc -o hello.exe hello.c (哦,windows用習慣了) | |
gcc -o hello.asm -S hello.c | |
-pipe | |
使用管道代替編譯中臨時文件,在使用非gnu彙編工具的時候,可能有些問題 | |
gcc -pipe -o hello.exe hello.c | |
-ansi | |
關閉gnu c中與ansi c不兼容的特性,激活ansi c的專有特性(包括禁止一些asm inline typeof關鍵字,以及UNIX,vax等預處理宏, | |
-fno-asm | |
此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作關鍵字。 | |
-fno-strict-prototype | |
只對g++起作用,使用這個選項,g++將對不帶參數的函數,都認為是沒有顯式的對參數的個數和類型說明,而不是沒有參數. | |
而gcc無論是否使用這個參數,都將對沒有帶參數的函數,認為城沒有顯式說明的類型 | |
-fthis-is-varialble | |
就是向傳統c++看齊,可以使用this當一般變量使用. | |
-fcond-mismatch | |
允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型 | |
-funsigned-char | |
-fno-signed-char | |
-fsigned-char | |
-fno-unsigned-char | |
這四個參數是對char類型進行設置,決定將char類型設置成unsigned char(前兩個參數)或者 signed char(後兩個參數) | |
-include file | |
包含某個代碼,簡單來說,就是便以某個文件,需要另一個文件的時候,就可以用它設定,功能就相當於在代碼中使用#include<filename>; | |
例子用法: | |
gcc hello.c -include /root/pianopan.h | |
-imacros file | |
將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身並不出現在輸入文件中 | |
-Dmacro | |
相當於C語言中的#define macro | |
-Dmacro=defn | |
相當於C語言中的#define macro=defn | |
-Umacro | |
相當於C語言中的#undef macro | |
-undef | |
取消對任何非標準宏的定義 | |
-Idir | |
在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭文件,如果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他 | |
回先在你所制定的目錄查找,然後再按常規的順序去找. | |
對於#include<file>;,gcc/g++會到-I制定的目錄查找,查找不到,然後將到系統的缺省的頭文件目錄查找 | |
-I- | |
就是取消前一個參數的功能,所以一般在-Idir之後使用 | |
-idirafter dir | |
在-I的目錄裡面查找失敗,講到這個目錄裡面查找. | |
-iprefix prefix | |
-iwithprefix dir | |
一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找 | |
-nostdinc | |
使編譯器不再系統缺省的頭文件目錄裡面找頭文件,一般和-I聯合使用,明確限定頭文件的位置 | |
-nostdin C++ | |
規定不在g++指定的標準路經中搜索,但仍在其他路徑中搜索,.此選項在創libg++庫使用 | |
-C | |
在預處理的時候,不刪除註釋信息,一般和-E使用,有時候分析程序,用這個很方便的 | |
-M | |
生成文件關聯的信息。包含目標文件所依賴的所有源代碼你可以用gcc -M hello.c來測試一下,很簡單。 | |
-MM | |
和上面的那個一樣,但是它將忽略由#include<file>;造成的依賴關係。 | |
-MD | |
和-M相同,但是輸出將導入到.d的文件裡面 | |
-MMD | |
和-MM相同,但是輸出將導入到.d的文件裡面 | |
-Wa,option | |
此選項傳遞option給彙編程序;如果option中間有逗號,就將option分成多個選項,然後傳遞給會彙編程序 | |
-Wl.option | |
此選項傳遞option給連接程序;如果option中間有逗號,就將option分成多個選項,然後傳遞給會連接程序. | |
-llibrary | |
制定編譯的時候使用的庫 | |
例子用法 | |
gcc -lcurses hello.c | |
使用ncurses庫編譯程序 | |
-Ldir | |
制定編譯的時候,搜索庫的路徑。比如你自己的庫,可以用它制定目錄,不然 | |
編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。 | |
-O0 | |
-O1 | |
-O2 | |
-O3 | |
編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高 | |
-g | |
只是編譯器,在編譯的時候,產生調試信息。 | |
-gstabs | |
此選項以stabs格式聲稱調試信息,但是不包括gdb調試信息. | |
-gstabs+ | |
此選項以stabs格式聲稱調試信息,並且包含僅供gdb使用的額外調試信息. | |
-ggdb | |
此選項將盡可能的生成gdb的可以使用的調試信息. | |
-static | |
此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什麼 | |
動態連接庫,就可以運行. | |
-share | |
此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫. | |
-traditional | |
試圖讓編譯器支持傳統的C語言特性 | |
[參考資料] | |
-Linux/UNIX高級編程 | |
中科紅旗軟件技術有限公司編著.清華大學出版社出版 | |
-Gcc man page | |
[ChangeLog] | |
-2002-08-10 | |
ver 0.1 發佈最初的文檔 | |
-2002-08-11 | |
ver 0.11 修改文檔格式 | |
-2002-08-12 | |
ver 0.12 加入了對靜態庫,動態庫的參數 | |
-2002-08-16 | |
ver 0.16 增加了gcc編譯的4個階段的命令 | |
運行 gcc/egcs | |
**********運行 gcc/egcs*********************** | |
GCC 是 GNU 的 C 和 C++ 編譯器。實際上,GCC 能夠編譯三種語言:C、C++ 和 Object C(C 語言的一種面向對像擴展)。利用 gcc 命令可同時編譯並連接 C 和 C++ 源程序。 | |
如果你有兩個或少數幾個 C 源文件,也可以方便地利用 GCC 編譯、連接並生成可執行文件。例如,假設你有兩個源文件 main.c 和 factorial.c 兩個源文件,現在要編譯生成一個計算階乘的程序。 | |
代碼: | |
----------------------- | |
清單 factorial.c | |
----------------------- | |
int factorial (int n) | |
{ | |
if (n <= 1) | |
return 1; | |
else | |
return factorial (n - 1) * n; | |
} | |
----------------------- | |
清單 main.c | |
----------------------- | |
#include <stdio.h>; | |
#include <unistd.h>; | |
int factorial (int n); | |
int main (int argc, char **argv) | |
{ | |
int n; | |
if (argc < 2) | |
{ | |
printf ("Usage: %s n\n", argv [0]); | |
return -1; | |
} | |
else | |
{ | |
n = atoi (argv[1]); | |
printf ("Factorial of %d is %d.\n", n, factorial (n)); | |
} | |
return 0; | |
} | |
----------------------- | |
利用如下的命令可編譯生成可執行文件,並執行程序: | |
$ gcc -o factorial main.c factorial.c | |
$ ./factorial 5 | |
Factorial of 5 is 120. | |
GCC 可同時用來編譯 C 程序和 C++ 程序。一般來說,C 編譯器通過源文件的後綴名來判斷是 C 程序還是 C++ 程序。在 Linux 中,C 源文件的後綴名為 .c,而 C++ 源文件的後綴名為 .C 或 .cpp。但是,gcc 命令只能編譯 C++ 源文件,而不能自動和 C++ 程序使用的庫連接。因此,通常使用 g++ 命令來完成 C++ 程序的編譯和連接,該程序會自動調用 gcc 實現編譯。假設我們有一個如下的 C++ 源文件(hello.C): | |
#include <iostream>; | |
void main (void) | |
{ | |
cout << "Hello, world!" << endl; | |
} | |
則可以如下調用 g++ 命令編譯、連接並生成可執行文件: | |
$ g++ -o hello hello.C | |
$ ./hello | |
Hello, world! | |
**********************gcc/egcs 的主要選項********* | |
gcc 命令的常用選項 | |
選項 解釋 | |
-ansi 只支持 ANSI 標準的 C 語法。這一選項將禁止 GNU C 的某些特色, | |
例如 asm 或 typeof 關鍵詞。 | |
-c 只編譯並生成目標文件。 | |
-DMACRO 以字符串「1」定義 MACRO 宏。 | |
-DMACRO=DEFN 以字符串「DEFN」定義 MACRO 宏。 | |
-E 只運行 C 預編譯器。 | |
-g 生成調試信息。GNU 調試器可利用該信息。 | |
-IDIRECTORY 指定額外的頭文件搜索路徑DIRECTORY。 | |
-LDIRECTORY 指定額外的函數庫搜索路徑DIRECTORY。 | |
-lLIBRARY 連接時搜索指定的函數庫LIBRARY。 | |
-m486 針對 486 進行代碼優化。 | |
-o FILE 生成指定的輸出文件。用在生成可執行文件時。 | |
-O0 不進行優化處理。 | |
-O 或 -O1 優化生成代碼。 | |
-O2 進一步優化。 | |
-O3 比 -O2 更進一步優化,包括 inline 函數。 | |
-shared 生成共享目標文件。通常用在建立共享庫時。 | |
-static 禁止使用共享連接。 | |
-UMACRO 取消對 MACRO 宏的定義。 | |
-w 不生成任何警告信息。 | |
-Wall 生成所有警告信息。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment