1、支援眾程式語言、平台
2、構建過程(c**如何變成可執行檔案)
預處理:把程式設計師編譯的c**翻譯成標準c**
彙編:把預處理後的c**翻譯成彙編**
編譯:把彙編**翻譯成二進位制指令
3、gcc -v 檢視版本
4、檔案字尾
.h 標頭檔案
.gch 標頭檔案的編譯結果,一般刪除
.c 原始檔
.i 預處理檔案
.s 彙編檔案
.o 目標檔案
.a 靜態檔案
.so 共享庫檔案
5、引數
-static 優先使用靜態庫
-e 預處理
-s 彙編
-c 編譯(生成目標檔案)
-o 指定編譯結果的名字
-wall 產生盡可能多的警告
-werror 把警告當作錯誤處理
-x 指定編譯語言
-g 生成除錯資訊
-on 優化等級
-d 在編譯時定義巨集
-l 鏈結時新增庫
-i 指定標頭檔案的查詢路徑,配置環境變數
1、開啟 vim ~/.bashrc
2、在檔案末尾,新增一行export c_include_path=$c_include_path:new_path
注意:如果要刪除環境變數需要在~/.bashrc檔案中刪除環境變數後,退出終端重新開啟。
標頭檔案的作用:
1、說明對應.c檔案中的內容有哪些(宣告函式、全域性變數)
2、定義結構、聯合、列舉、巨集。
3、型別重定義
6、預處理指令
#include 檔案包含,注意區分""和<>
#define 巨集常量和巨集函式
# 把識別符號轉換成字串
## 合併識別符號
#undef 刪除巨集
#line 指定行號
#if 根據條件決定**是否生成,可以盡量減小可執行檔案的大小
#ifndef 標頭檔案衛士,防止標頭檔案被重複包含
#error 在編譯期間產生錯誤
#warning 在編譯期間產生警告
#pragma gcc dependency 「demo.c」 用於監控檔案,防止所依賴的檔案,修改後而不知道
#pragma gcc poison goto 用於禁用某些識別符號
#pragma pack(n) 設定結構、聯合的補齊和對齊位元組數 n必須是2的較小次方且比預設值小
1、建立靜態庫
編寫源**:vi .c/.h
編譯源**:gcc -c ***.c -> ***.o
打包生成靜態庫:ar -r lib***.a x1.o x2.o ...
ar的命令的一些引數:
-r 把目標檔案新增到靜態庫中,已經存在的更新,庫檔案不存在則建立
-q 把目標檔案追加到靜態檔案末尾 ar -q libmath.a add.o
-d 從靜態庫中刪除目標檔案 ar -d libmath.a add.o
-t 顯示靜態庫中有哪些目標檔案 ar -t libmath.a
-x 把靜態庫拆分成目標檔案
2、呼叫靜態庫
(1)直接呼叫:呼叫者要和庫再同一路徑下
gcc main.c lib***.a
(2)設定環境變數:設定方法於c_include_path類似
1、開啟vim ~/.bashrc 檔案
2、在檔案末尾新增一行 export library_path=$library_path:庫檔案的路徑
4、編譯時要指定庫名 gcc main.c -lmath
(3)設定編譯引數:-l路徑
gcc main.c -l路徑 -lmath
3、執行
在編譯時已經把被呼叫函式的二進位制複製到可執行檔案中了,再執行時不再需要靜態庫檔案。
1、建立共享庫
編寫源**:vi .c/.h
編譯出位置無關的目標檔案:gcc -c -fpic ***.c -> ***.o
2、呼叫共享庫
(1)直接呼叫:呼叫者要和庫再同一路徑下
gcc main.c lib***.so
(2)設定環境變數:設定方法於c_include_path類似
1、開啟vim ~/.bashrc 檔案
2、在檔案末尾新增一行 export library_path=$library_path:庫檔案的路徑
4、編譯時要指定庫名 gcc main.c -lmath
(3)設定編譯引數:-l路徑
gcc main.c -l路徑 -lmath
3、執行
在使用共享庫時,呼叫者只是記錄了被調**在庫中的位置,因此在執行時需要共享庫同時被載入。作業系統會根據ld_library_path環境變數的設定來載入共享庫。
標頭檔案:#include
1、載入共享庫
void *dlopen(const char *filename,int flag);
filename :共享庫的庫名,或路徑
flag:
rtld_lazy 使用時才載入
rtld_now 立即載入
返回值:共享庫的控制代碼(類似檔案指標)
2、獲取識別符號位址並使用
void *dlsym(char *handle,const char *symbol);
handle:共享庫的控制代碼
symbol:識別符號的名字
3、解除安裝共享庫
int dlclose(void *handle);
handle:共享庫的控制代碼
返回值:成功返回0,失敗返回-1
4、獲取錯誤資訊
char *dlerror(void);
返回值:會把在使用共享庫的過程**現的錯誤,以字串形式返回
nm:檢視目標檔案、可執行檔案、靜態庫、共享庫中的符號列表
ldd:檢視可執行程式所依賴的共享庫
strip:**,去除掉目標檔案、可執行檔案、靜態庫和共享庫中的符號列表、除錯資訊。
objdump:顯示二進位制模組的反彙編資訊。
作業系統執行環境
程式的執行 完成與體系結構相關的工作 重點 作業系統必須了解和適配硬體 完成應用程式所需的共性任務,提供各種基礎服務 效能,安全,健壯性等問題 作業系統中的中斷 異常機制很重要,可以比作汽車的發動機,飛機的引擎.也可以說作業系統由中斷驅動或者事件驅動 i o 中斷 鍵盤上control c,印表機結...
5 作業系統環境
1.執行環境 作業系統 硬體 應用程式通過作業系統來控制硬體。同乙份 可以通過虛擬機器執行到不同的平台上。2.bios和引導 bios儲存在主機板上的rom中。開機時bios中的引導程式會把啟動盤中的 os 載入至記憶體執行。作業系統是多個程式的集合體,把共用的東西整合起來,對於解放生產力太重要了。...
作業系統課堂筆記二 作業系統執行環境
作業系統執行機制 中斷異常機制工作原理 系統呼叫機制 系統呼叫實戰 參考舉例 陷入指令 訪管指令 是一條特殊的指令,通過這條指令,可以使使用者程式向作業系統提出各種各樣的請求,例如 int,trap,syscall,sysenter sy it 核心態 使用者態 概念 cpu對系統發生某個事件的一種...