嵌入式學習筆記之gcc編譯器

2021-10-02 12:49:16 字數 2776 閱讀 7495

原始檔需要經過編譯才能生成可執行檔案,pc下的編譯工具鏈為gcc, ld, objcopy等, 它們編譯出來的程式在x86平台下執行,要編譯出可以在arm平台執行的程式,就需要使用交叉編譯工具 arm-linux-gcc, arm-linux-ld等,主要介紹前者.

乙個c/c++檔案要經過 預處理(preprocessing), 編譯(compilation), 彙編(assembly)和連線(linking)四個步驟才可以變成可執行檔案.日常通常用」編譯」統稱這四個步驟,下面分別介紹這四個步驟:

1) 預處理:   c/c++原始檔中,以」#」為開頭的命令為預處理命令,如」#include」包含命令, 「#define」巨集定義命令,」#if」,」#ifdef」條件編譯命令等. 預處理就是將要包含的檔案插入到原始檔中,將巨集定義展開,根據條件編譯命令選擇使用需要的**,最後生成乙個」.i」檔案進行進一步處理->".i"檔案

2)編譯:就是把c/c++**如」.i」檔案 「翻譯」 成彙編** ->「.s」檔案

3)彙編;就是將第二步輸出的彙編**」翻譯」成一定格式的機器**,linux下一般表現為elf目標檔案(obj檔案),而反彙編則是將機器**轉換成彙編**,這在除錯中經常用到.->」.o」檔案按

4)連線:連線就是將上一步生成的obj檔案和庫檔案連線起來最終生成在特定平台上執行的可執行檔案

下面以乙個簡單的 helloworld程式為例

在進行編譯之前首先介紹一下gcc編譯器以及常用選項:

gcc編譯器使用方法:

gcc [選項] 檔名    //選項可以有多個

gcc常用選項:選項

功能-v

檢視當前gcc編譯器的版本,也可以顯示gcc執行時候的詳細過程

-o 指定輸出檔名為file,這個file名稱不可以和源檔名同名

-e只預處理

-s只編譯

-c進行編譯和彙編,不會進行連線

在ubuntu終端下建立乙個hello.c檔案,將程式寫好後,退出,儲存.

詳細每一步的命令如下:

如果沒有-o選項,則只輸出」a.out」可執行檔案

這樣一步一步來比較麻煩,gcc會對.c檔案預設進行預處理操作,於是省略了前倆步,只需要-c來編譯,彙編,得到.o檔案,再將.o檔案進行鏈結,得到可執行檔案.簡單步驟如下

從乙個.c檔案生成乙個可執行的檔案經過了

hello.c(預處理)->hello.i(編譯)->hello.s(彙編)->hello.o(鏈結)->hello

這四個步驟

當我們詳細看其生成檔案大小的時候會發現可執行檔案比原始檔大很多

這是因為鏈結的時候會將生成的obj 檔案,系統庫的obj檔案,庫檔案鏈結起來,這樣最後的可執行檔案就會比原來的大很多

gcc -v -nostdlib -o hello hello.o:

會提示因為沒有鏈結系統標準啟動檔案和標準庫檔案,而鏈結失敗。

這個-nostdlib 選項常用於裸機 bootloader、 linux 核心等程式,因為它們不

需要啟動檔案、標準庫檔案。

一般應用程式才需要系統標準啟動檔案和標準庫檔案。 裸機/bootloader、linux 核心等程式不需要啟動檔案、標準庫檔案。

而鏈結又可以分為動態鏈結以及靜態鏈結

動態鏈結使用動態鏈結庫進行鏈結,生成的程式在執行的時候需要載入所需要的動態庫才可以執行,上面的都是動態鏈結,生成的程式體積相對較小,但是需要一欄所需的動態庫,否則無法執行.

而靜態檔案則使用靜態庫進行連線,生成的程式包含程式所需要的全部庫,可以直接執行,但是靜態連線生成的程式體積較大:

比較倆種鏈結方式生成的可執行程式的大小:

可見比動態鏈結大很多.

再舉乙個包含三個檔案的例子:

終端新建乙個資料夾,建立三個檔案 main.c, sub.c, sub.h如下:

用helloworld中的簡單命令如下:

gcc -c -o main.o main.c

gcc -c -o sub.o sub.c

gcc -o test sub.o main.o

其中 main.o, sub.o是經過了預處理,編譯,彙編後而生成的obj檔案,最後一步將他們鏈結成了可執行檔案test

嵌入式Linux編譯器gcc

一 gcc簡介 gcc 又是乙個交叉平台編譯器,它能夠在當前平台上為多種不同體系結構的硬體平台開發軟體。任意一款處理器都有自己的組合語言,生成的機器碼只能被自身的cpu識別。arm linux gcc test.c o test 此時linux平台下執行的 可在arm平台上執行 1.什麼是gnu計畫...

嵌入式Linux編譯器 gcc gdb

gcc gnu compiler collection 是編譯器的集合 gcc gcc中c編譯器 gcc相當於頂層的管理器,gcc本身並不參與編譯的過程。預處理的時候gcc呼叫cpp預處理,鏈結時候gcc呼叫ld鏈結。所以程式可以實現分布編譯。gcc支援的檔案 gcc基本用法 gcc option ...

嵌入式Linux開發工具 編譯器gcc以及庫的製作

是什麼?為什麼?嵌入式硬體受限於成本 怎麼做?畫個餅 編譯命令的各種字尾 c 對原始檔進行編譯或彙編 e 對原始檔進行預處理 s 對原始檔進行編譯 o file 輸出目標檔案file w 遮蔽所有的警告資訊 wall 顯示所有型別的警告資訊 o0123 零 一 二 優化 idir 指定標頭檔案的搜尋...