【Linux】GCC程序開發工具(上)

00. 目錄

01. GNU工具概述

​ 在Linux中,GNU Tools是主要的程序的開發工具,這組工具主要用於生成代碼和分析程序。GNU Tools最重要的組成部分是GCC。GCC是GNU Compiler Collection的縮寫,是一個非常優秀的跨平臺編譯器集合,支持x86、ARM、MIPS和PowerPC等多種目標平臺,支持C、C++、Java、ADA、Fortran和Pascal等多種高級語言。

​ GCC能完成從C、C++、Objective-C等源文件向運行在特定CPU硬件上的目標代碼的轉換。對於通用計算機、一般使用GCC生成x86的可執行代碼,對於嵌入式開發系統使用交叉編譯GCC,生成目標機可以執行的程序。

02. 常用文本文件

*.c C語言源文件

*.C *.cxx *.cc C++語言源文件

*.i 預處理後的C語言源文件

*.ii 預處理後的C++語言源文件

*.s *.S 彙編語言文件

*.h 頭文件

03. 常用二進制文件

*.o 目標文件

*.so 動態庫

*.a 靜態庫

.c爲後綴的文件,C語言源代碼文件;

.a爲後綴的文件,是由目標文件構成的檔案庫文件;

.C,.cc或.cxx 爲後綴的文件,是C++源代碼文件且必須要經過預處理

.h爲後綴的文件,是程序所包含的頭文件

.i 爲後綴的文件,是C源代碼文件且不應該對其執行預處理

.ii爲後綴的文件,是C++源代碼文件且不應該對其執行預處理

.m爲後綴的文件,是Objective-C源代碼文件;

.mm爲後綴的文件是Objective-C++源代碼文件;

.o爲後綴的文件,是編譯後的目標文件

.s爲後綴的文件,是彙編語言源代碼文件;

.S爲後綴的文件,是經過預編譯彙編語言源代碼文件。

04. Binutils工具集

​ GCC是一組工具的集合,包含了預處理器、編譯器、彙編器、連接器部分。當使用GCC的時候,將根據需要調用相應的工具。對於默認的文件名,GCC可以自動選擇工具來完成文件處理過程。從C語言的源程序到可執行文件的轉換,實質上是依靠GCC調用一系列工具完成的。

​ Binutils是一個二進制工具的集合,包含了彙編、鏈接以及一系列的輔助工具。binutils是輔助GCC的重要工具集,主要包含以下的工具。

as: GNU彙編器,用於將處理器的彙編格式代碼轉換成可執行代碼,並存儲到目標文件.o文件中

ld: GNU連接器,用於將一個或者多個目標文件(.o)、庫組合成一個可執行的程序,或者生成靜態庫或者靜態庫。

ar: 歸檔工具,可以將多個文件組合成一個大文件,並且可以讀取原始文件的內容

strip: 去除文件中的符號

nm: 可以i顯示目標文件中的符號

objcopy: 轉換二進制代碼的工具,可以將二進制代碼轉換成各種格式

objdump: 顯示目標文件的反彙編工具

readelf: 顯示ELF文件的各種信息

strings: 顯示文件中可打印字符

ranlib: 產生歸檔文件的索引,並將其保存到歸檔文件中。

addr2line: 可以將一個可執行程序的地址映射到源文件的對應的行

gprof: 顯示程序調用段的各種信息。

05. GCC工具

5.1 gcc用法參考

[root@deng test]# gcc --help
用法:gcc [選項] 文件...
選項:
  -pass-exit-codes         在某一階段退出時返回最高的錯誤碼
  --help                   顯示此幫助說明
  --target-help            顯示目標機器特定的命令行選項
  (使用‘-v --help’顯示子進程的命令行參數)
  -dumpspecs               顯示所有內建 spec 字符串
  -dumpversion             顯示編譯器的版本號
  -dumpmachine             顯示編譯器的目標處理器
  -print-search-dirs       顯示編譯器的搜索路徑
  -print-libgcc-file-name  顯示編譯器伴隨庫的名稱
  -print-file-name=<>    顯示 <> 的完整路徑
  -print-prog-name=<程序>  顯示編譯器組件 <程序> 的完整路徑
  -print-multi-directory   顯示不同版本 libgcc 的根目錄
  -print-multi-lib         顯示命令行選項和多個版本庫搜索路徑間的映射
  -print-multi-os-directory 顯示操作系統庫的相對路徑
  -Wa,<選項>               將逗號分隔的 <選項> 傳遞給彙編器
  -Wp,<選項>               將逗號分隔的 <選項> 傳遞給預處理器
  -Wl,<選項>               將逗號分隔的 <選項> 傳遞給鏈接器
  -Xassembler <參數><參數> 傳遞給彙編器
  -Xpreprocessor <參數><參數> 傳遞給預處理器
  -Xlinker <參數><參數> 傳遞給鏈接器
  -combine                 將多個源文件一次性傳遞給彙編器
  -save-temps              不刪除中間文件
  -pipe                    使用管道代替臨時文件
  -time                    爲每個子進程計時
  -specs=<文件><文件> 的內容覆蓋內建的 specs 文件
  -std=<標準>              指定輸入源文件遵循的標準
  --sysroot=<目錄><目錄> 作爲頭文件和庫文件的根目錄
  -B <目錄><目錄> 添加到編譯器的搜索路徑中
  -b <機器>                爲 gcc 指定目標機器(如果有安裝)
  -V <版本>                運行指定版本的 gcc(如果有安裝)
  -v                       顯示編譯器調用的程序
  -###                     與 -v 類似,但選項被引號括住,並且不執行命令
  -E                       僅作預處理,不進行編譯、彙編和鏈接
  -S                       編譯到彙編語言,不進行彙編和鏈接
  -c                       編譯、彙編到目標代碼,不進行鏈接
  -o <文件>                輸出到 <文件>
  -x <語言>                指定其後輸入文件的語言
                           允許的語言包括:c c++ assembler none
                           ‘none’意味着恢復默認行爲,即根據文件的擴展名猜測
                           源文件的語言
                           
                           
  -w 			不顯示警告信息
  -W 			指定需要顯示的警告信息
  -Wall 		表示顯示所有的警告信息
  -Werr 		將警告信息當成錯誤、並終止編譯
  -DMACRO		定義宏MACRO爲字符串1
  -DMACRO=DEF	定義MACRO宏爲字符串DEF
  -UMACRO		取消對MACRO宏的定義
  -ggdb			生成可被gdb使用的標準調試信息
  -mXXX			針對XXX CPU進行優化,例如XXX可以是486 586等
  -O0			不進行代碼優化
  -O或者-O1	   進行一般的代碼優化,減少執行代碼大小和執行的時間
  -O2			比-O1進行更多的優化,減少執行代碼大小和執行的時間
  -O3			比-O2更進一步優化
  -MM			輸出源文件的依賴關係
  -ansi 		編譯器將所有的gnu的編譯器特性都關掉,可以讓程序和Ansi標準兼容
  -include file 編譯之前將file包含進去,相當於在所有編譯的源文件最前面加入include <file>語句
  -imacros file 與-include file一樣,不過這個文件在具體編譯的時候只有裏面定義的宏才起作用,
  				所以只用來在file文件中定義宏
  -nostdinc 	在搜尋include的文件路徑中去掉標準的C語言頭文件搜索路徑,例如stdin.h文件
  				就是放在標準頭文件搜索路徑下。
  -C 			通-E參數配合使用,讓預處理後的結果保留註釋,一遍程序更易讀。
  -nostartfiles 在鏈接的時候不把系統相關的啓動代碼鏈接起來
  -nostdlib 	在鏈接的時候不把標準庫鏈接進來
  
以 -g、-f、-m、-O、-W 或 --param 開頭的選項將由 gcc 自動傳遞給其調用的
 不同子進程。若要向這些進程傳遞其他選項,必須使用 -W<字母> 選項。

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:     表示含有調試信息
-Wall:    表示輸出所有的警告
-I.     表示包含當前目錄作爲頭文件搜索路徑,這個選項用於增加搜索頭文件的路徑
-pipe:      表示使用管道替換臨時文件
-o:      指定輸出地目標文件的名稱

06. 附錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章