welcom ! Handel home

2024年12月2日 星期一

ubuntu gcc 安裝 Note


# ==ubuntu 安裝 gcc ===

# 系統套件更新檢查

$sudo apt update && sudo apt upgrade

#透過 apt 裝 gcc

$sudo apt install gcc

#安装 build-essential 软件包,该软件包包含 GCC 及一系列开发工具,如 make、g++ 和dpkg-dev。

$sudo apt install build-essential

#要验证 GCC 编译器是否已成功安装,可以使用以下命令查看 GCC 版本

$gcc --version

#=== hello.c 編譯測試 gcc =====

$nano hello.c

  #include <stdio.h>


int main(void){
	printf("Hello, World!\n");
	return 0;
}


# 編譯 C 程式
gcc hello.c
# 執行編譯好的程式
./a.out
# 執行編譯好的程式
./a.out
Hello, world!

# 編譯 C 程式,指定輸出檔名
gcc -o hello hello.c

# 執行編譯好的程式
./hello

只編譯不連結

GCC 預設會將 C 的原始碼編譯並連結,產生執行檔,若想讓編譯器只進行編譯、不要連結,可加上 -c 參數,這樣就會建立一個 object 檔:

# 僅編譯、不連結,建立 obj 檔案
gcc -c hello.c

執行這行之後,就會產生一個 hello.o 檔案,後續若要進行連結,就可以使用這個 object 檔:

# 連結產生執行檔
gcc -o hello hello.o

通常在大型的專案中,都會將編譯與連結兩個動作拆開,以下是一個典型的例子:

# 編譯個別 C 檔案
gcc -c a.c
gcc -c b.c
gcc -c c.c

# 連結
gcc -o myapp a.o b.o c.o

這樣作除了可讓程式碼方便管理之外,也可以加快編譯的速度,假設我們在開發過程中,更改了 b.c 的內容,在重新編譯時就只要編譯 b.c,然後即可進連結,省去重新編譯 a.c 與 c.c 的時間。

最佳化

GCC 可以根據 CPU 的架構,進行最佳化處理,編譯出效能更好的執行檔,可用的選項有 -O(跟 -O1 相同)、-O2 與 -O3,數字越高代表最佳化的程度越高,許多專案在編譯正式版的時候,都會使用 -O2 進行最佳化。

# 進行最佳化
gcc -O2 -o hello hello.c

標頭檔與函式庫路徑

在編譯程式時,編譯器需要許多標頭檔(*.h 檔案)來編譯原始碼,而連結的時候則會需要一些函式庫(*.a*.so 等)才能進行連結,但是編譯器只會自動引入一些系統預設的檔案,在大型專案中開發者會需要指定許多額外的標頭檔與函式庫位置,這樣才能讓編譯器順利編譯與連結。

編譯器會在 include 路徑中,搜尋 C 程式碼中以 #include 所引入的標頭檔,如果需要指定額外的搜尋路徑,可以使用 -I 參數增加搜尋路徑,假設我們有一些標頭檔放在 /home/gtwang/include 目錄下,而要新增這個路徑就可以這樣寫:

# 新增標頭檔搜尋路徑
gcc -I/home/gtwang/include -o hello hello.c
由於標頭檔的名稱都寫在 C 程式碼中,所以檔名都是已知的,只需要告訴編譯器路徑即可進行編譯。

在連結時期所需要函式庫名稱與路徑,可以透過 GCC 的 -l 與 -L 參數來指定。在 Linux 中假設有一個 libsum.a 函式庫放在 /home/gtwang/lib 目錄下,若要將其納入連結,則可以這樣寫:

# 納入指定的函式庫
gcc -lsum -L/home/gtwang/lib -o hello hello.c

沒有留言: