gcc的简单使用教程
前幾天在學習嵌入式入門時,有一個視頻中就是介紹gcc的使用的,看了視頻后突然好
想將GCC的手冊頁翻譯出來,后來看到手冊頁發現實在太多了,憑我個人的能力根本無
法完成,只能寫一些自己使用Gcc時的一些常規使用方法.
GCC是GNU的成員之一,原意是GNU的C語言編譯器,后來發展到不只能夠編譯C語
言,他還支持編譯C++,OBJECTIVE-C等多種計算機語言時,現在的意思就變成了GNU
的編譯器集合了.
一般用法:
gcc [Options] Infile......
描述:
當你常規使用gcc編譯一個程序時,他通常執行4個步驟:預編譯,編譯,匯編,連接.
當然你可以通過指定某個選項來使它停止在某個步驟上.如你可以通過指定選項-S
選項來使他停止在編譯上(也就是說讓gcc只做預編譯,編譯后就不繼續做下去了)
由于gcc接受選項和文件作為操作符,它的大多數選項都是多個字母組成的
(注:如-static選項,它是一個選項,而不是我們在一般命令中見到的由多個選項組
合),因此我們不能將多個單一字母的選項組合在一起,如-dv選項不等于-d和-v選項的
組合。
你可以混合使用選項和參數,對于大多數選項來說,你不必關心你指定這些
選項的位置,但當你多次指定同一個選項(如-I選項)時,你就需要關心他們出現的順序
了,這是因為這些選項通常會指導gcc從某些目錄中查找一些需要的文件,而選項的
順序正是gcc查找目錄的順序,這也就是說,你指定在前面的選項的目錄優先查找。
下面是一些常規選項:
[1].指定GCC進行的操作的選項
-E :讓GCC僅進行預處理后就不繼續作下去了
-S :讓GCC僅進行預處理,編譯后就不繼續作下去了
-c :讓GCC僅進行預處理,編譯,匯編后就不繼續作下去了
-o Ouput:指定輸出文件,默認gcc編譯輸出的程序名為a.out.
@File:讓gcc執行指定文件File中的命令,該文件中每個gcc命令以空白符隔開
[2].指定使用的C語言標準
-std=Standard:指定標準,詳細標準參考gcc手冊頁,你可以指定-std=c89(使用
89年制定的C語言標準),也可以指定-std=c99(使用99年制定的C標準)
-ansi:等價于-std=c89
[3].控制輸出信息
-w:禁止輸出所有警告信息
-Wall:輸出所有警告信息
-Werror:將所有警告信息當成錯誤信息輸出
[4].調試相關選項(生成調試信息)
-g:生成用于GDB調試程序使用的調試信息
-p:生成用于prof程序使用的調試信息
-pg:生成用于gprof程序使用的調試信息
[5].程序優化選項
-O,-O1:初步優化(會占用更多時間進行編譯,但是編譯后的程序運行時占用
的內存更少)
-O2:比-O1更進一步優化
-O3:比-O2更進一步優化
-O0:不進行優化
[6].宏操作
-D name:定義宏name的值為1,類似在源程序中使用#define name 1
-D name=val:定義宏name的值為val,類似#define name val
-U name:取消宏name的定義,類似#undef name
-undef:取消所有系統指定或GCC指定的宏定義,但保留標準預定義的宏
[7].指定搜索目錄
-I dir,-Idir:追加目錄dir到頭文件的搜索路徑中
-L dir,-Ldir:追加目錄dir到庫文件的搜索路徑中
-Bprefix:指定gcc查找庫文件,頭文件,數據文件的目錄
[8].指定使用的庫文件,頭文件
-nostdinc:不使用標準頭文件(默認在/usr/include)
-nostdlib:不使用標準庫文件(默認在/usr/lib)
-l library:指定使用的庫文件,默認gcc在編譯一個程序時只連接到標準c庫
上,是用該選項能夠使他連接到指定的庫上,例如若你要連接到
數學庫上(libm.a)則你只須指定 -lm就可以了。也就是說這個選項
指定連接的庫文件可以將前綴lib和后綴.a(或.so)省略。
-nostartfiles:不使用標準的系統的startup文件
[9].指定連接庫文件的方式
-shared:動態連接到庫文件上,這是默認行為。
-static:靜態連接到庫文件上
注:動態連接和靜態連接的區別在于:動態連接是在程序運行時才連接到
庫文件上(也就是需要用到時才連接上),而靜態連接則是在編譯時就
將程序連接到庫文件中(這樣做會增大程序,但便于移植)
[10].雜項
--sysroot=Dir:指定頭文件和庫文件的搜索路徑的根目錄。頭文件搜索目錄
為Dir/usr/include,庫文件的搜索目錄為Dir/usr/lib,默認Dir為空
-march=體系結構類型:詳細情況參見man gcc
-mtune=CPU類型:詳細情況參見man gcc
實例:
cat<<"EOF">example.c
#include
int main(void)
{
int i,sum=0;
for(i=0;i<=100;i++)
sum+=i;
printf("1+...+100=%d\n",sum);
return 0;
}
EOF
常規編譯: gcc -o example example.c
編譯后就可以在編譯目錄中執行 ./example來運行程序
優化編譯: gcc -O2 -o example_1 example.c
可以使用 time ./example和time ./example_1來比較它們的運行時間,你就會發現優化后
程序運行時間明顯短于未優化的程序
總結
以上是生活随笔為你收集整理的gcc的简单使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GDB调试工具使用教程(博客)
- 下一篇: 重装pip