Linux系統程式設計4 編譯鏈結

2022-05-23 14:24:07 字數 2145 閱讀 9508

編譯**的步驟:

預處理器:源**經過預處理器處理後變成了修改後的源**,主要是處理#符號開頭的特殊行;

編譯器: 編譯修改後的源**,將翻譯後的機器語言指令,也就是目標**,儲存在目標檔案中;

目標檔案:不是完整的程式,因為它不包含一些必要的執行時庫,所以無法執行;

執行時庫:執行一些常規操作或者某些困難任務預先編寫好的**庫;具有廣泛性,程式難免要用到它的一部分;

可執行檔案:包含機器語言指令或可執行**,已經可以在計算機上執行;

許多ide實際上整合了上述功能, 只需要單擊乙個按鈕,或從選單中選擇乙個選單項即可完成預處理,編譯,鏈結,甚至執行程式;

命令列模式下編譯c語言程式,這樣能夠了解生成乙個可執行程式的詳細步驟,以及編譯命令的各種設定選項,為以後的 linux c/c++ 開發打好堅實的基礎。

gcc 僅僅是乙個編譯器,沒有介面,必須在命令列模式下使用。通過gcc命令就可以將原始檔編譯成可執行檔案。

linux不以檔案字尾來區分可執行檔案,linux 下的可執行檔案字尾理論上可以是任意的,

這裡的.out只是用來表明它是 gcc 的輸出檔案。不管原始檔的名字是什麼,gcc 生成的可執行檔案的預設名字始終是a.out。

如果不想使用預設的檔名,那麼可以通過-o選項來自定義檔名

gcc main.c -o main.out

因為 linux 下可執行檔案的字尾僅僅是一種形式上的,所以可執行檔案也可以不帶字尾

gcc main.c -o main

字尾說明:

.o //編譯的目標檔案,對應於windows的.obj檔案

.so //動態鏈結庫(共享庫),是shared object,用於動態連線的,對應於windows的.dll

.a //靜態庫,對應於windows的.lib

.c .cpp .h //原始檔,標頭檔案

.out //只是一種形式上的字尾

.sh.conf

1、編譯

gcc -c main.c

乙個原始檔會生成乙個目標檔案,多個原始檔會生成多個目標檔案,原始檔數目和目標檔案數目是一樣的。

通常情況下,預設的目標檔案名字和原始檔名字是一樣的。

如果希望自定義目標檔案的名字,那麼可以使用-o選項

gcc -c main.c -o a.o

2、鏈結

gcc main.o //gcc命令後面緊跟目標檔案的名字,就可以將目標檔案鏈結成為可執行檔案;

//而且會自動識別到底是原始檔還是目標檔案;

//如果是原始檔,要經過編譯,鏈結兩個步驟才能生成可執行檔案;

//如果是目標檔案,只需要鏈結就可以了;

原始檔的字尾名,只是為了表明該檔案中儲存的是某種語言的**;

工程/專案->為當前程式配備的專用資料夾;

程式分類

不帶介面的 ->控制台程式

帶介面,用滑鼠點選 ->gui程式

不單獨出現的,只作為其他程式的乙個組成部分->靜態庫,動態庫

源**經過編譯(compile),鏈結(link)兩個過程才能變成可執行檔案

編譯器一次只能編譯乙個原始檔,如果包含了多個原始檔,也需要多次編譯,每次編譯的結果是產生乙個中間檔案;

當程式的所有中間檔案以及系統庫(或者理解為系統中的一些元件)組合在一起時,才能形成最終的可執行檔案。

這個組合的過程叫做鏈結;完成鏈結功能的軟體叫做鏈結器

即便編譯後的程式可能只有乙個中間檔案,不再需要和其他中間檔案結合了,但是還需要和一些系統庫組合。這個過程也是鏈結;

Linux系統程式設計 4

1.網路4層模型 網路7層模型 只是概念未實現 只是為了分析方便 2.tcp ip協議是整個協議棧最大的協議,所以就以他們為名 3.tcp 可靠 面向連線 基於流 udp 不可靠 無連線 基於資料報 4.埠號 1024 常用 5.流式套接字 原始套接字 測試使用 小端 反之 主機位元組序 7.共享記...

Linux系統程式設計10 硬鏈結與軟鏈結

理解硬鏈結和軟鏈結概念前,需要先了解檔案和inode相關背景知識 linux系統程式設計5 檔案描述符 linux系統程式設計9 inode機制 索引節點 inode 要了解鏈結,我們首先得了解乙個概念,叫索引節點 inode 在linux系統中,核心為每乙個新建立的檔案分配乙個inode 索引結點...

Linux 系統程式設計

1 i o操作 2 檔案和目錄管理 3 記憶體管理 1 建立匿名記憶體對映 2 對映 dev zero檔案 類unix 作業系統中,dev zero是乙個特殊的檔案,當你讀它的時候,它會提供無限的空字元 null,ascii nul,0x00 其中的乙個典型用法是用它提供的字元流來覆蓋資訊,另乙個常...