一.gcc簡介
gcc 又是乙個交叉平台編譯器,它能夠在當前平台上為多種不同體系結構的硬體平台開發軟體。
任意一款處理器都有自己的組合語言,生成的機器碼只能被自身的cpu識別。
arm-linux-gcc test.c –o test 此時linux平台下執行的**可在arm平台上執行
1. 什麼是gnu計畫?
一種開源和自由軟體的計畫。(gnu is notunix.)
2. 什麼是交叉編譯?為什麼要進行交叉編譯?
在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的**,我們就稱這種編譯器支援交叉編譯。這個編譯過程就叫交叉編譯。
之所以要進行交叉編譯,有時是因為目的平台上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特徵;有時是因為目的平台上的資源貧乏,無法執行我們所需要編譯器;有時又是因為目的平台還沒有建立,連作業系統都沒有,根本談不上執行什麼編譯器。
二.編譯選項
1.編譯器編譯過程
乙個.c檔案轉換成可執行檔案大概需要四個階段:
第一步 預處理 gcc -e test.c -o test.i //生成預編譯處理檔案
第二步 編譯 gcc -c test.s-o test.o //生成目標檔案
第三步 彙編 gcc -s test.i-o test.s //生成彙編檔案
第四步 鏈結 gcc test.o -o test //生成可執行檔案
1. 預處理(標頭檔案載入、巨集替換、條件編譯(以#開頭的**))不做語法檢查
gcc –etest.c > test.i
vimtest.i 檢視預處理後檔案
*系統標頭檔案存放目錄:/user/include/stdio.h
#include:在系統目錄(/user/include/)中找stdio.h檔案,若不存在則報錯;
#include"stdio.h":先在當前目錄中找stdio.h檔案,若找不到,則再在系統目錄中找,若仍找不到,則報錯。
-i+第三方尋找目錄,
例如:gcc –wall -o3 main.c test,c -o main -i/root/include
*封裝標頭檔案
gcc main.c test.c –o main
在test.h中宣告test.c,在main.c中包含標頭檔案
#include」test.h」/#include 「路徑/test.h」
#include將test.h複製到/user/include目錄下
gcc–wall –o3 main.c test.c –o main –i/root/include
(/root/include即為test.h所在目錄)
2. 編譯(語法檢查、語法分析)
gcc -c test.s -o test.o
gcc -w test.c //關閉警告
gcc -wall test.c //開啟全部警告
gcc -static //gcc 進行靜態編譯,也把所有都需要的函式庫都整合進編譯出來的程式上,這個程式就可以不依賴外部的函式庫執行
3. 彙編(目標檔案生成彙編**)
gcc –ctest.s –o test.o
4. 鏈結階段(符號鏈結、檔案載入。核心工作是符號表解析和重定位。)
/user/lib:軟體、程式所需執行的庫檔案
/lib:系統執行的庫檔案
庫檔案:看不到庫檔案裡定義的函式和變數,但是可以使用
sdk:由大量庫檔案構成(系統開發包)
靜態庫:.a 在編譯時將庫檔案裡的**段搬遷到可執行檔案裡
動態庫:.so 在執行時將需要的庫檔案裡的**段搬遷到可執行檔案裡
靜態庫與動態庫的優缺點:
靜態庫:**體積小、執行效率高、不易於公升級、編譯效率低、易於**布局
動態庫:**體積大、執行效率低、易於公升級、編譯效率高、不易於**布局
printf,scanf,strcpy——>libc.a,libc.so
sin——>libm.a,libm.so
gccmain.c –lm
(-l鏈結乙個庫,m為庫名)
2. 編譯器優化
gcc預設提供了5級優化選項的集合:
-o0:無優化(預設)
-o和-o1:使用能減少目標文 件大小以及執行時間並且不會使編譯時間明顯增加的優化.在編譯大型程式的時候會顯著增加編譯時記憶體的使用.
-o2: 包含-o1的優化並增加了不需要在目標檔案大小和執行速度上進行折衷的優化.編譯器不執行迴圈展開以及函式內聯.此選項將增加編譯時間和目標檔案的執行性 能.
-os:專門優化目標檔案大小,執行所有的不增加目標檔案大小的-o2優化選項.並且執行專門減小目標檔案大小的優化選項.
-o3: 開啟所有-o2的優化選項並且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning,-fgcse-after-reload and -ftree-vectorize優化選項.
3. 編譯器警告(
1). -w 選項:
關閉警告資訊(2
). -wall 選項:
開啟所有警告資訊
4. 編譯器巨集定義(-d)
gcc test.c -d__debug__:在**中加入__debug__巨集定義
5. 編譯器指定第三方檔案搜尋路徑(-l)(
1).-i選項:向
gcc的標頭檔案搜尋路徑中新增新的目錄。
gcc -o hello hello.c -i /home/crosstar/include
要求gcc
在/home/crosstar/include/
目錄下尋找所需要的標頭檔案。 (
2).-l選項:向
gcc的庫檔案搜尋路徑中新增新的目錄。
gcc -o test test.c -l /home/crosstar/lib –lfoo
要求gcc
在/home/crosstar/lib/
目錄下尋找所需的庫檔案
libfoo.so (
3).-l選項:要求
gcc鏈結庫檔案
libfoo.so。注:
linux
下的庫檔案命名約定
:通常以
lib三個字母開頭。
由於所有的庫檔案都遵循同樣的規範,因此在用
-l選項指定鏈結的庫檔名時可以省去
lib三個字母,也就是說
gcc在對
-lfoo
進行處理時,會自動去鏈結名為
libfoo.a/libfoo.so
的檔案。
三.靜態庫與動態庫的製作與使用
*靜態庫的生成:
arrcs libtest.a test.o(編譯後的.o檔案封裝到test.a庫檔案中)
gcc main.c -ltest -l.(當前目錄)
(rc:若靜態庫不存在,則建立;s:若靜態庫存在,則更新)
(-l……:指定庫的搜尋路徑)
*動態庫的生成:
gcc-shared -fpic test.c -o libtest.so
gcc main.c ./libtest.so(當前路徑)
嵌入式Linux編譯器 gcc gdb
gcc gnu compiler collection 是編譯器的集合 gcc gcc中c編譯器 gcc相當於頂層的管理器,gcc本身並不參與編譯的過程。預處理的時候gcc呼叫cpp預處理,鏈結時候gcc呼叫ld鏈結。所以程式可以實現分布編譯。gcc支援的檔案 gcc基本用法 gcc option ...
嵌入式學習筆記之gcc編譯器
原始檔需要經過編譯才能生成可執行檔案,pc下的編譯工具鏈為gcc,ld,objcopy等,它們編譯出來的程式在x86平台下執行,要編譯出可以在arm平台執行的程式,就需要使用交叉編譯工具 arm linux gcc,arm linux ld等,主要介紹前者.乙個c c 檔案要經過 預處理 prepr...
嵌入式Linux開發工具 編譯器gcc以及庫的製作
是什麼?為什麼?嵌入式硬體受限於成本 怎麼做?畫個餅 編譯命令的各種字尾 c 對原始檔進行編譯或彙編 e 對原始檔進行預處理 s 對原始檔進行編譯 o file 輸出目標檔案file w 遮蔽所有的警告資訊 wall 顯示所有型別的警告資訊 o0123 零 一 二 優化 idir 指定標頭檔案的搜尋...