【Linux】GCC程序开发工具(上)
00. 目錄
文章目錄
- 00. 目錄
- 01. GNU工具概述
- 02. 常用文本文件
- 03. 常用二進(jìn)制文件
- 04. Binutils工具集
- 05. GCC工具
- 06. 附錄
01. GNU工具概述
? 在Linux中,GNU Tools是主要的程序的開發(fā)工具,這組工具主要用于生成代碼和分析程序。GNU Tools最重要的組成部分是GCC。GCC是GNU Compiler Collection的縮寫,是一個(gè)非常優(yōu)秀的跨平臺(tái)編譯器集合,支持x86、ARM、MIPS和PowerPC等多種目標(biāo)平臺(tái),支持C、C++、Java、ADA、Fortran和Pascal等多種高級(jí)語(yǔ)言。
? GCC能完成從C、C++、Objective-C等源文件向運(yùn)行在特定CPU硬件上的目標(biāo)代碼的轉(zhuǎn)換。對(duì)于通用計(jì)算機(jī)、一般使用GCC生成x86的可執(zhí)行代碼,對(duì)于嵌入式開發(fā)系統(tǒng)使用交叉編譯GCC,生成目標(biāo)機(jī)可以執(zhí)行的程序。
?
02. 常用文本文件
*.c C語(yǔ)言源文件
*.C *.cxx *.cc C++語(yǔ)言源文件
*.i 預(yù)處理后的C語(yǔ)言源文件
*.ii 預(yù)處理后的C++語(yǔ)言源文件
*.s *.S 匯編語(yǔ)言文件
*.h 頭文件
03. 常用二進(jìn)制文件
*.o 目標(biāo)文件
*.so 動(dòng)態(tài)庫(kù)
*.a 靜態(tài)庫(kù)
.c為后綴的文件,C語(yǔ)言源代碼文件;
.a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件;
.C,.cc或.cxx 為后綴的文件,是C++源代碼文件且必須要經(jīng)過預(yù)處理;
.h為后綴的文件,是程序所包含的頭文件;
.i 為后綴的文件,是C源代碼文件且不應(yīng)該對(duì)其執(zhí)行預(yù)處理;
.ii為后綴的文件,是C++源代碼文件且不應(yīng)該對(duì)其執(zhí)行預(yù)處理;
.m為后綴的文件,是Objective-C源代碼文件;
.mm為后綴的文件是Objective-C++源代碼文件;
.o為后綴的文件,是編譯后的目標(biāo)文件;
.s為后綴的文件,是匯編語(yǔ)言源代碼文件;
.S為后綴的文件,是經(jīng)過預(yù)編譯的匯編語(yǔ)言源代碼文件。
04. Binutils工具集
? GCC是一組工具的集合,包含了預(yù)處理器、編譯器、匯編器、連接器部分。當(dāng)使用GCC的時(shí)候,將根據(jù)需要調(diào)用相應(yīng)的工具。對(duì)于默認(rèn)的文件名,GCC可以自動(dòng)選擇工具來完成文件處理過程。從C語(yǔ)言的源程序到可執(zhí)行文件的轉(zhuǎn)換,實(shí)質(zhì)上是依靠GCC調(diào)用一系列工具完成的。
? Binutils是一個(gè)二進(jìn)制工具的集合,包含了匯編、鏈接以及一系列的輔助工具。binutils是輔助GCC的重要工具集,主要包含以下的工具。
as: GNU匯編器,用于將處理器的匯編格式代碼轉(zhuǎn)換成可執(zhí)行代碼,并存儲(chǔ)到目標(biāo)文件.o文件中
ld: GNU連接器,用于將一個(gè)或者多個(gè)目標(biāo)文件(.o)、庫(kù)組合成一個(gè)可執(zhí)行的程序,或者生成靜態(tài)庫(kù)或者靜態(tài)庫(kù)。
ar: 歸檔工具,可以將多個(gè)文件組合成一個(gè)大文件,并且可以讀取原始文件的內(nèi)容
strip: 去除文件中的符號(hào)
nm: 可以i顯示目標(biāo)文件中的符號(hào)
objcopy: 轉(zhuǎn)換二進(jìn)制代碼的工具,可以將二進(jìn)制代碼轉(zhuǎn)換成各種格式
objdump: 顯示目標(biāo)文件的反匯編工具
readelf: 顯示ELF文件的各種信息
strings: 顯示文件中可打印字符
ranlib: 產(chǎn)生歸檔文件的索引,并將其保存到歸檔文件中。
addr2line: 可以將一個(gè)可執(zhí)行程序的地址映射到源文件的對(duì)應(yīng)的行
gprof: 顯示程序調(diào)用段的各種信息。
?
05. GCC工具
5.1 gcc用法參考
[root@deng test]# gcc --help 用法:gcc [選項(xiàng)] 文件... 選項(xiàng):-pass-exit-codes 在某一階段退出時(shí)返回最高的錯(cuò)誤碼--help 顯示此幫助說明--target-help 顯示目標(biāo)機(jī)器特定的命令行選項(xiàng)(使用‘-v --help’顯示子進(jìn)程的命令行參數(shù))-dumpspecs 顯示所有內(nèi)建 spec 字符串-dumpversion 顯示編譯器的版本號(hào)-dumpmachine 顯示編譯器的目標(biāo)處理器-print-search-dirs 顯示編譯器的搜索路徑-print-libgcc-file-name 顯示編譯器伴隨庫(kù)的名稱-print-file-name=<庫(kù)> 顯示 <庫(kù)> 的完整路徑-print-prog-name=<程序> 顯示編譯器組件 <程序> 的完整路徑-print-multi-directory 顯示不同版本 libgcc 的根目錄-print-multi-lib 顯示命令行選項(xiàng)和多個(gè)版本庫(kù)搜索路徑間的映射-print-multi-os-directory 顯示操作系統(tǒng)庫(kù)的相對(duì)路徑-Wa,<選項(xiàng)> 將逗號(hào)分隔的 <選項(xiàng)> 傳遞給匯編器-Wp,<選項(xiàng)> 將逗號(hào)分隔的 <選項(xiàng)> 傳遞給預(yù)處理器-Wl,<選項(xiàng)> 將逗號(hào)分隔的 <選項(xiàng)> 傳遞給鏈接器-Xassembler <參數(shù)> 將 <參數(shù)> 傳遞給匯編器-Xpreprocessor <參數(shù)> 將 <參數(shù)> 傳遞給預(yù)處理器-Xlinker <參數(shù)> 將 <參數(shù)> 傳遞給鏈接器-combine 將多個(gè)源文件一次性傳遞給匯編器-save-temps 不刪除中間文件-pipe 使用管道代替臨時(shí)文件-time 為每個(gè)子進(jìn)程計(jì)時(shí)-specs=<文件> 用 <文件> 的內(nèi)容覆蓋內(nèi)建的 specs 文件-std=<標(biāo)準(zhǔn)> 指定輸入源文件遵循的標(biāo)準(zhǔn)--sysroot=<目錄> 將 <目錄> 作為頭文件和庫(kù)文件的根目錄-B <目錄> 將 <目錄> 添加到編譯器的搜索路徑中-b <機(jī)器> 為 gcc 指定目標(biāo)機(jī)器(如果有安裝)-V <版本> 運(yùn)行指定版本的 gcc(如果有安裝)-v 顯示編譯器調(diào)用的程序-### 與 -v 類似,但選項(xiàng)被引號(hào)括住,并且不執(zhí)行命令-E 僅作預(yù)處理,不進(jìn)行編譯、匯編和鏈接-S 編譯到匯編語(yǔ)言,不進(jìn)行匯編和鏈接-c 編譯、匯編到目標(biāo)代碼,不進(jìn)行鏈接-o <文件> 輸出到 <文件>-x <語(yǔ)言> 指定其后輸入文件的語(yǔ)言允許的語(yǔ)言包括:c c++ assembler none‘none’意味著恢復(fù)默認(rèn)行為,即根據(jù)文件的擴(kuò)展名猜測(cè)源文件的語(yǔ)言-w 不顯示警告信息-W 指定需要顯示的警告信息-Wall 表示顯示所有的警告信息-Werr 將警告信息當(dāng)成錯(cuò)誤、并終止編譯-DMACRO 定義宏MACRO為字符串1-DMACRO=DEF 定義MACRO宏為字符串DEF-UMACRO 取消對(duì)MACRO宏的定義-ggdb 生成可被gdb使用的標(biāo)準(zhǔn)調(diào)試信息-mXXX 針對(duì)XXX CPU進(jìn)行優(yōu)化,例如XXX可以是486 586等-O0 不進(jìn)行代碼優(yōu)化-O或者-O1 進(jìn)行一般的代碼優(yōu)化,減少執(zhí)行代碼大小和執(zhí)行的時(shí)間-O2 比-O1進(jìn)行更多的優(yōu)化,減少執(zhí)行代碼大小和執(zhí)行的時(shí)間-O3 比-O2更進(jìn)一步優(yōu)化-MM 輸出源文件的依賴關(guān)系-ansi 編譯器將所有的gnu的編譯器特性都關(guān)掉,可以讓程序和Ansi標(biāo)準(zhǔn)兼容-include file 編譯之前將file包含進(jìn)去,相當(dāng)于在所有編譯的源文件最前面加入include <file>語(yǔ)句-imacros file 與-include file一樣,不過這個(gè)文件在具體編譯的時(shí)候只有里面定義的宏才起作用,所以只用來在file文件中定義宏-nostdinc 在搜尋include的文件路徑中去掉標(biāo)準(zhǔn)的C語(yǔ)言頭文件搜索路徑,例如stdin.h文件就是放在標(biāo)準(zhǔn)頭文件搜索路徑下。-C 通-E參數(shù)配合使用,讓預(yù)處理后的結(jié)果保留注釋,一遍程序更易讀。-nostartfiles 在鏈接的時(shí)候不把系統(tǒng)相關(guān)的啟動(dòng)代碼鏈接起來-nostdlib 在鏈接的時(shí)候不把標(biāo)準(zhǔn)庫(kù)鏈接進(jìn)來以 -g、-f、-m、-O、-W 或 --param 開頭的選項(xiàng)將由 gcc 自動(dòng)傳遞給其調(diào)用的不同子進(jìn)程。若要向這些進(jìn)程傳遞其他選項(xiàng),必須使用 -W<字母> 選項(xiàng)。5.2 參考示例
[root@deng test]# ls a.out main.c myputs.c myputs.h test.c test.h [root@deng test]# gcc -pipe -g -Wall -I. -c test.c -o test.o [root@deng test]# #解釋 -g: 表示含有調(diào)試信息 -Wall: 表示輸出所有的警告 -I. 表示包含當(dāng)前目錄作為頭文件搜索路徑,這個(gè)選項(xiàng)用于增加搜索頭文件的路徑 -pipe: 表示使用管道替換臨時(shí)文件 -o: 指定輸出地目標(biāo)文件的名稱06. 附錄
6.1【Linux】GCC程序開發(fā)工具(上)
6.2 【Linux】GCC程序開發(fā)工具(中)
6.3 【Linux】GCC程序開發(fā)工具(下)
總結(jié)
以上是生活随笔為你收集整理的【Linux】GCC程序开发工具(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言】C语言实现面向对象编程之多态
- 下一篇: 【IT资讯】Linus Torvalds