g編譯類
A. 請問linux下,gcc編譯程序的過程(從讀取源文件到製作可執行程序中間所有過程,越詳細越好)
gcc -S *.c 預處理+反匯編
C語言是一門歷史很長的編程語言,其編譯器和開發工具也多種多樣,其開發工具包括編譯器,現舉幾個開發工具供大家選擇,當然也要根據自己的操作系統來選擇適合自己的開發工具。
好多剛開始接觸c語言的朋友都想知道用上面軟體開發c語言比較好,一般來說微軟的東西肯定是最好的,更適合新手學習,等上手了就可以接觸別的軟體了。
MicrosoftVisualC、MicrosoftVisualStudio、DEVC、Code::Blocks、BorlandC、WaTComC、BorlandCBuilder、GNUDJGPPC、Lwin32CCompiler3.1、HighC、TurbC、g、C-Free和Win-TC、MyTc等等,太多了,由於C語言比較成熟,所以編程環境很多。建議使用MicrosoftVisualC。
在Windows下做軟體開發,編譯器的首選當然是VisualStudio,目前微軟也有免費的MicrosoftVisualC2008Express版本可供下載和使用。但是,如果考慮做跨平台的軟體,選擇g作為編譯器無疑是明智的,無論Linux,MacOSX還是其他的Unix變體,大多選用g作為編譯器,所以,選擇g作為編譯器能夠讓你的軟體提前通過編譯器的驗證,能夠更容易的在不同平台上通過編譯。TDMGCC項目已經幫助大家測試並整合了Windows平台下的g安裝工具TDMGCCOn-DemandInstaller,大家可以根據需要選擇下載並安裝那些工具包。安裝完成後,需要修改環境變數,將安裝目錄加入PATH搜索路徑中。
1、TC2.0:Borland公司的產品,在dos界面下編譯運行,小巧、靈活,但是不能使用滑鼠,界面如下:
菜單命令是alt菜單項的第一個字母,可以調試,在第一次用的時候,可以需要配置一下目錄,如下:
第一次使用可能感覺不舒服(滑鼠不能用的緣故),慢慢熟悉一段時間,就沒事了,當初在學校學習考試都是這個環境。
2、win-TC:在tc2.0的基礎上加上了界面,能夠使用滑鼠,具有語法高亮,可以嵌入匯編等特點,對新手一些,拜託了不能用滑鼠的困難。編寫完源代碼,進行編譯運行即可辯悶,軟體比較容易上手。
3、dev-C:是windows下一款開發c/c的開發環境,使用g為編譯器,遵循標准,功能比較強大,語法高亮態灶源,可以進行單步調試(這對排除錯誤很重要),進行斷點設置等功能,遵循C標准,是一款很強大的開發工具。
4、VC,微軟的產品,編譯器,鏈接器,運行,調試等功能於一體的強大開發工具,特點是功能十分強大,對於新手來說需要一段時間去摸索
c語言編程軟體(支持win7/win8)是一款支持多語言開發的開發系統。c語言編程軟體(支持win7/win8)同時支持c語言,c以及vb語言的開發,軟體能很好的兼容win7以及win8,用戶只需設置軟體兼容性,把它設為win98,winxp等等。
為大家提供的c語言編程軟體為vc6.0。VC6.0是Microsoft公司推出的一個基於Windows系統平台、可視化的集成開發環境,它的源程序按C語言的要求編寫,並加入了微軟提供的功能強大的MFC(MicrosoftFoundationClass)類庫。
c語言編程軟體(支持win7/win8)的MFC類庫中封裝了大部分WindowsAPI函數和Windows控制項,它包含的功能涉及到整個Windows操作系統。MFC不僅給用戶提供了Windows圖形環境下應用程序的框架,而且還提供了創建應用程序的組件,這樣,開發人員不必從頭設計創建和管理一個標准Windows應用程序所需的程序,而是從一個比較高的起點編程,故節省了大量的時間。另外,它提供了大量的代碼,指導帆態用戶編程時實現某些技術和功能。因此,使用VC提供的高度可視化的應用程序開發工具和MFC類庫,可使應用程序開發變得簡單。
C. gcc -g -o -c分別是什麼意思
-c和-o都是gcc編譯器的可選參數。
-c表示只編譯(compile)源文件但不鏈接,會把.c或.cc的c源程序編譯成目標文件,一般是.o文件。-o用於指定輸出(out)文件名。不用-o的話,一般會在當前文件夾下生成默認的a.out文件作為可執行程序。
例如:
gcc -c test.c將生成test.o的目標文件
gcc -o app test.c將生成可執行程序app
gcc -c a.c -o a.o表示把源文件a.c編譯成指定文件名a.o的中間目標文件(其實在這里,把-o a.o省掉,效果是一樣的,因為中間文件默認與源文件同名,只是後綴變化)。
1、如果GCC不帶-C參數,編譯一個源代碼文件(test.c)。那麼會自動將編譯和鏈接一步完成,並生成可執行文件。可執行文件可以有-o參數指定(test.o)
2、如果是多個文件,則需要先編譯成中間目標文件(一般是.o文件),在鏈接成可執行文件,一般習慣目標文件都是以.o後綴,也沒有硬性規定可執行文件不能用.o文件。
(3)g編譯類擴展閱讀:
gcc:GNU編譯器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go語言的前端,也包括了這些語言的庫(如libstdc++、libgcj等等)。GCC的初衷是為GNU操作系統專門編寫的一款編譯器。GNU系統是徹底的自由軟體。此處,「自由」的含義是它尊重用戶的自由。
基本用法:
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-O,對程序進行優化編譯、鏈接,採用這個選項,整個源代碼會在編譯、鏈接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、鏈接的速度就相應地要慢一些。
D. 四種文法的類型(編譯原理)
喬姆斯基(Chomsky)按產生式的類型把文法分為四種類型:0、1、2、3型文法。
*在下文中的產生式中,箭頭左邊的大寫字母為嚴格的非終結符,而其左邊的小寫字母不嚴格要求為非終結符,如[0型文法]中的第2條產生式。
【0型文法】
產生式形式:α→β
要求:箭頭左邊的α 至少 含有 一個非終結符 , 其餘 不加任何限制
例如,G:C→AaB
aA→a
B→b|Bb
【1型文法】
產生式形式:α→β
要求: |α|≤|β| (產生式左端的長度<=右端的長度),S→ε除外。
例如G: C→aAB
aA→aBa
B→b|Bb
【2型文法】(上下文無關文法)
產生式形式:A→β,A∈VN(終結符) ,β∈V *(VN∪VT,即可為終結符也可為非終結符)
說明:當以β替換A時,與A的上下文環境無關;
大部分程序設計語言近似於2型文法。
【3型文法】(正規文法 / 右線性文法)
產生式形式:A→a,A→aB,
說明:a∈VT(終結符) , A,B∈VN(非終結符),即產生式右端的第一個符號必須為 終結符
例如 G:A→aB
B→b|bB
【其他說明】對於這四種類型的文法:
*包含關系:0 > 1 > 2 > 3 (以'>'代替包含符,'A>B'譯為A包含B)
*嚴格程度:3 > 2 > 1 > 0
*判斷文法所屬類型的順序:3 → 2 → 1 → 0
E. gcc的使用技巧
首先檢查是否在你的機器上安裝了GCC,使用命令:
可用rpm -q gcc檢查。
如果沒有安裝,請依序檢查並安裝下面各RPM
libbinutils
binutils
make
glibc-devel
gcc-cpp
gcc
看下面的例子:test.c #include<stdio.h>intmain(){char*str=IlikeLinux!;printf(%s,str);return0;}使用gcc編譯。輸入gcc -c test.c得到目標文件test.o.-c命令表示對文件進行編譯和匯編。但並不連接。如果再鍵入gcc -o ../bin/test test.o,那麼將得到名為test的可執行文件。其實這兩步可以一氣呵成,gcc ../bin/test test.c.如果程序沒有錯誤就生成了可執行文件。也許你會覺得基於命令行的編譯器比不上如VC之類的集成開發環境,的確gcc的界面要改進,但是你一旦熟練了就會感到。gcc的效率如此之高。可以告訴大家的是Linux底下強大的C/C++集成開發環境Kdevelop和Vc一樣強大,使用了Gcc編譯器。
GNU C編譯器 即gcc是一個功能強大的ANSI C兼容編譯器,你會操作其他操作系統下的一種C編譯器,能很快掌握GCC.
1、使用Gcc,Gcc是基於命令行的,使用時通常後跟一些選項和文件名。Gcc的基本用法如下: gcc [options] [filenames] 命令行選項制定操作將對命令行上的每個給出的文件執行。
2、GCC的常用選項
編譯選項:gcc有超過100個的編譯選項可用。具體的可以使用命令man gcc察看
優化選項:用GCC編譯C/C++代碼時,它會試著用最少的時間完成編譯並且編譯後的代碼易於調試。易於調試意味著編譯後的代碼與源代碼有同樣的執行順序,編譯後的代碼沒有經過優化。有很多的選項可以告訴GCC在耗費更多編譯時間和犧牲易調試性的基礎上產生更小更快的可執行文件。這些選項中最典型的就是-O和-O2。-O選項告訴gcc對源代碼進行基本優化。-O2選項告訴GCC產生盡可能小的和盡可能快的代碼。還有一些很特殊的選項可以通過man gcc察看。
調試和剖析選項:GCC支持數種調試剖析選項。在這些選項中最常用的是-g和-pg.-g選項告訴gcc產生能被GNU調試器(如gdb)使用的調試信息,以便調試用戶的程序。-pg選項告訴gcc在用戶的程序中加入額外的代碼,執行時,產生gprof用的剖析信息以顯示程序的耗時情況。
3、使用gdb
使用方法:在命令行中鍵入gdb並按回車就可以運行gdb了,啟動gdb後,能在命令行上制定很多的選項,也可以下面的方式來運行gdb: gdb filename 用這種方式運行gdb時,能直接指定想要調試的程序。在命令行上健入gdb -h得到一個有關gdb的選項的說明簡單列表。
編譯代碼以供調試,為了使gdb工作,必須使程序在編譯時包含調試信息,調試信息包含程序里的每個變數的類型,在可執行文件里的地址映射以及源代碼的行號。gdb利用這些信息使源代碼和機器碼相關聯。
關於gcc的大體就寫這么多吧,更多的信息可以查找幫助,記得學習Linux的一大武器man或者info命令,下次在介紹一下使用C/C++編寫大型程序的makefile文件和make命令。
F. linux 用g++編譯c++代碼的問題
*
運行 gcc/egcs
*
gcc/egcs 的主要選項
*
gdb
*
gdb 的常用命令
*
gdb 使用範例
*
其他程序/庫工具 (ar, objmp, nm, size, strings, strip, ...)
* 創建和使用靜態庫
* 創建和使用共享庫
* 使用高級共享庫特性
1.7.1 運行 gcc/egcs
Linux 中最重要的軟體開發工具是 GCC。GCC 是 GNU 的 C 和 C++ 編譯器。實際上,GCC 能夠編譯三種語言:C、C++ 和 Object C(C 語言的一種面向對象擴展)。利用 gcc 命令可同時編譯並連接 C 和 C++ 源程序。
#DEMO#: hello.c
如果你有兩個或少數幾個 C 源文件,也可以方便地利用 GCC 編譯、連接並生成可執行文件。例如,假設你有兩個源文件 main.c 和 factorial.c 兩個源文件,現在要編譯生成一個計算階乘的程序。
-----------------------
清單 factorial.c
-----------------------
#include <stdio.h>
#include <stdlib.h>
int factorial (int n)
{
if (n <= 1)
return 1;
else
return factorial (n - 1) * n;
}
-----------------------
-----------------------
清單 main.c
-----------------------
#include <stdio.h>
#include <stdlib.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.h>
void main (void)
{
cout << "Hello, world!" << endl;
}
則可以如下調用 g++ 命令編譯、連接並生成可執行文件:
$ g++ -o hello hello.C
$ ./hello
Hello, world!
1.7.2 gcc/egcs 的主要選項
表 1-3 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 生成所有警告信息。
#DEMO#
MiniGUI 的編譯選項
1.7.3 gdb
GNU 的調試器稱為 gdb,該程序是一個互動式工具,工作在字元模式。在 X Window 系統中,
有一個 gdb 的前端圖形工具,稱為 xxgdb。gdb 是功能強大的調試程序,可完成如下的調試
任務:
* 設置斷點;
* 監視程序變數的值;
* 程序的單步執行;
* 修改變數的值。
在可以使用 gdb 調試程序之前,必須使用 -g 選項編譯源文件。可在 makefile 中如下定義
CFLAGS 變數:
CFLAGS = -g
運行 gdb 調試程序時通常使用如下的命令:
gdb progname
在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有:
* aliases:命令別名
* breakpoints:斷點定義;
* data:數據查看;
* files:指定並查看文件;
* internals:維護命令;
* running:程序執行;
* stack:調用棧查看;
* statu:狀態查看;
* tracepoints:跟蹤程序執行。
鍵入 help 後跟命令的分類名,可獲得該類命令的詳細清單。
#DENO#
1.7.4 gdb 的常用命令
表 1-4 常用的 gdb 命令
命令 解釋
break NUM 在指定的行上設置斷點。
bt 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。
clear 刪除設置在特定源文件、特定行上的斷點。其用法為:clear FILENAME:NUM。
continue 繼續執行正在調試的程序。該命令用在程序由於處理信號或斷點而
導致停止運行時。
display EXPR 每次程序停止後顯示表達式的值。表達式由程序定義的變數組成。
file FILE 裝載指定的可執行文件進行調試。
help NAME 顯示指定命令的幫助信息。
info break 顯示當前斷點清單,包括到達斷點處的次數等。
info files 顯示被調試文件的詳細信息。
info func 顯示所有的函數名稱。
info local 顯示當函數中的局部變數信息。
info prog 顯示被調試程序的執行狀態。
info var 顯示所有的全局和靜態變數名稱。
kill 終止正被調試的程序。
list 顯示源代碼段。
make 在不退出 gdb 的情況下運行 make 工具。
next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。
print EXPR 顯示表達式 EXPR 的值。
1.7.5 gdb 使用範例
-----------------
清單 一個有錯誤的 C 源程序 bugging.c
-----------------
#include <stdio.h>
#include <stdlib.h>
static char buff [256];
static char* string;
int main ()
{
printf ("Please input a string: ");
gets (string);
printf ("\nYour string is: %s\n", string);
}
-----------------
上面這個程序非常簡單,其目的是接受用戶的輸入,然後將用戶的輸入列印出來。該程序使用了
一個未經過初始化的字元串地址 string,因此,編譯並運行之後,將出現 Segment Fault 錯誤:
$ gcc -o test -g test.c
$ ./test
Please input a string: asfd
Segmentation fault (core mped)
為了查找該程序中出現的問題,我們利用 gdb,並按如下的步驟進行:
1.運行 gdb bugging 命令,裝入 bugging 可執行文件;
2.執行裝入的 bugging 命令;
3.使用 where 命令查看程序出錯的地方;
4.利用 list 命令查看調用 gets 函數附近的代碼;
5.唯一能夠導致 gets 函數出錯的因素就是變數 string。用 print 命令查看 string 的值;
6.在 gdb 中,我們可以直接修改變數的值,只要將 string 取一個合法的指針值就可以了,為
此,我們在第 11 行處設置斷點;
7.程序重新運行到第 11 行處停止,這時,我們可以用 set variable 命令修改 string 的取值;
8.然後繼續運行,將看到正確的程序運行結果。
#DEMO#
1.7.6 其他程序/庫工具
strip:
nm:
size:
string:
1.7.7 創建和使用靜態庫
創建一個靜態庫是相當簡單的。通常使用 ar 程序把一些目標文件(.o)組合在一起,成為一個單獨的庫,然後運行 ranlib,以給庫加入一些索引信息。
1.7.8 創建和使用共享庫
特殊的編譯和連接選項
-D_REENTRANT 使得預處理器符號 _REENTRANT 被定義,這個符號激活一些宏特性。
-fPIC 選項產生位置獨立的代碼。由於庫是在運行的時候被調入,因此這個
選項是必需的,因為在編譯的時候,裝入內存的地址還不知道。如果
不使用這個選項,庫文件可能不會正確運行。
-shared 選項告訴編譯器產生共享庫代碼。
-Wl,-soname -Wl 告訴編譯器將後面的參數傳遞到連接器。而 -soname 指定了
共享庫的 soname。
# 可以把庫文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,並以
root 身份運行 ldconfig;或者
# 運行 export LD_LIBRARY_PATH='pwd',它把當前路徑加到庫搜索路徑中去。
1.7.9 使用高級共享庫特性
1. ldd 工具
ldd 用來顯示執行文件需要哪些共享庫, 共享庫裝載管理器在哪裡找到了需要的共享庫.
2. soname
共享庫的一個非常重要的,也是非常難的概念是 soname——簡寫共享目標名(short for shared object name)。這是一個為共享庫(.so)文件而內嵌在控制數據中的名字。如前面提到的,每一個程序都有一個需要使用的庫的清單。這個清單的內容是一系列庫的 soname,如同 ldd 顯示的那樣,共享庫裝載器必須找到這個清單。
soname 的關鍵功能是它提供了兼容性的標准。當要升級系統中的一個庫時,並且新庫的 soname 和老的庫的 soname 一樣,用舊庫連接生成的程序,使用新的庫依然能正常運行。這個特性使得在 Linux 下,升級使用共享庫的程序和定位錯誤變得十分容易。
在 Linux 中,應用程序通過使用 soname,來指定所希望庫的版本。庫作者也可以通過保留或者改變 soname 來聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫版本沖突問題的困擾。
查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫文件之間的關系
3. 共享庫裝載器
當程序被調用的時候,Linux 共享庫裝載器(也被稱為動態連接器)也自動被調用。它的作用是保證程序所需要的所有適當版本的庫都被調入內存。共享庫裝載器名字是 ld.so 或者是 ld-linux.so,這取決於 Linux libc 的版本,它必須使用一點外部交互,才能完成自己的工作。然而它接受在環境變數和配置文件中的配置信息。
文件 /etc/ld.so.conf 定義了標准系統庫的路徑。共享庫裝載器把它作為搜索路徑。為了改變這個設置,必須以 root 身份運行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個文件其實是裝載器內部使用的文件之一。
可以使用許多環境變數控制共享庫裝載器的操作(表1-4+)。
表 1-4+ 共享庫裝載器環境變數
變數 含義
LD_AOUT_LIBRARY_PATH 除了不使用 a.out 二進制格式外,與 LD_LIBRARY_PATH 相同。
LD_AOUT_PRELOAD 除了不使用 a.out 二進制格式外,與 LD_PRELOAD 相同。
LD_KEEPDIR 只適用於 a.out 庫;忽略由它們指定的目錄。
LD_LIBRARY_PATH 將其他目錄加入庫搜索路徑。它的內容應該是由冒號
分隔的目錄列表,與可執行文件的 PATH 變數具有相同的格式。
如果調用設置用戶 ID 或者進程 ID 的程序,該變數被忽略。
LD_NOWARN 只適用於 a.out 庫;當改變版本號是,發出警告信息。
LD_PRELOAD 首先裝入用戶定義的庫,使得它們有機會覆蓋或者重新定義標准庫。
使用空格分開多個入口。對於設置用戶 ID 或者進程 ID 的程序,
只有被標記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定
了全局版本號,該文件不遵守這個限制。
4. 使用 dlopen
另外一個強大的庫函數是 dlopen()。該函數將打開一個新庫,並把它裝入內存。該函數主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 伺服器利用這個函數在運行過程中載入模塊,這為它提供了額外的能力。一個配置文件控制了載入模塊的過程。這種機制使得在系統中添加或者刪除一個模塊時,都不需要重新編譯了。
可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,並在 dl 庫中實現。它需要兩個參數:一個文件名和一個標志。文件名可以是我們學習過的庫中的 soname。標志指明是否立刻計算庫的依賴性。如果設置為 RTLD_NOW 的話,則立刻計算;如果設置的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以後才載入的庫可以獲得其中的符號。
當庫被裝入後,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,並且調用裝載庫中的相應函數。
G. 如何用GCC在linux下編譯C語言程序
在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器,假設我們有下面一個非常簡單的源程序(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux
");
}
要編譯這個程序,我們只要在命令行下執行:
gcc -o hello hello.c
gcc 編譯器就會為我們生成一個hello的可執行文件.執行./hello就可以看到程
序的輸出結果了
H. linux中常用編譯器是什麼
Linux 下可用的編譯器有 GCC、EGCS 和 PGCC,其中最常用的編譯器便是 GCC。
GCC 起初是 GNU 推出的 C語言編
譯器,用於類 Unix 系統下的編程,所以名為 GNU C Compiler 。隨著眾多自由開發者的加入,GCC
發展迅速,如今已成為一個支持眾多語言的編譯器了,其中包括 C、C++、Ada、Object C 和 Java 等,以至於 GCC 開始被擴展為
GNU Compiler Collection ,也就是「GNU 編譯器集合」的意思。
GCC用法:
1、GCC基本用法及其選項
gcc 或 g++ 的用法跟參數含義幾乎一樣,他們最基本的用法是:
2、只編譯子程序(-c)
3、產生目標文件(-o)
4、附加調試信息(-g)
5、多文件編譯
6、連接庫文件。