1. 程式人生 > >ubuntu下編譯c程式的詳解

ubuntu下編譯c程式的詳解

1、c語言中的各種字尾名代表的意思:

.a檔案代表的是靜態庫

.c代表c原始碼

.h代表c原始碼標頭檔案

.i代表的是c原始碼(這是被預處理過後的結果)

.o物件檔案

.s組合語言的程式碼

.so動態庫

2、c語言程式從原始碼到生成可執行檔案的過程:c程式原始碼(.c檔案)-----(1)-----不用預處理的c程式原始碼(.i檔案)----(2)---組合語言檔案(.s檔案)------(3)-----機器語言檔案(.o檔案)-----(4)------可執行檔案

其中的每個過程的意義如下:過程(1)是預處理階段,這個階段主要是根據#開頭的命令修改c原始檔,主要的工作是,比如#include<stdio.h>命令告訴前處理器讀取系統檔案stdio.h的內容並且把相應的內容插入到原始碼中去,就形成了.i檔案。

過程(2):這個過程是編譯階段,編譯器將文字檔案.i檔案翻譯成文字檔案.s檔案。這個檔案是與原始檔等效的組合語言程式。

過程(3):這個過程主要是彙編階段,在這個階段中彙編器將.s檔案編譯成機器語言指令就是這裡的.o檔案。

過程(4):這個過程是連結階段,這個階段主要就是將程式中的一些庫函式用連結器給進行連結(連結過程包括靜態連結和動態連結,在這裡就不細說了)。

3、講一下ubuntu下面c源程式的各種檔案的獲得:(比如有一個源程式為hello.c檔案)

(1)、為了獲得可執行檔案可以使用命令:gcc hello.c -o a其中-o是用來指定所生成的可執行程式的檔名,比如這裡生成的檔名是a。

(2)、如果程式中用到了不是gcc預設的庫函式的時候,比如程式中用到了math.h這個標頭檔案。這個標頭檔案不是gcc預設的標頭檔案,所以在編譯的時候要加入-l庫的首字母來進行編譯。比如這裡是:gcc hello.c -lm -o a.

(3)、為了將源程式編譯成.o檔案的命令是指定引數-c來進行編譯。例如這裡要生成hello.o檔案的編譯為:gcc -c hello.c -o hello.o。

(4)如果要執行預處理的話,使用的編譯程式碼就是加上引數-E來進行編譯,比如我們這裡要生成hello.i檔案,則我們編譯程式碼是:gcc -E hello.c -o hello.i。

(5)、如果要生成彙編程式碼,使用的編譯程式碼就是加上引數-S進行編譯,比如我們要生成hello.s檔案,則我們使用的編譯程式碼是:gcc -S hello.c -o hello.s。