Linux系統學習筆記 第二天

2021-09-25 15:06:54 字數 2708 閱讀 7128

輔助工具

#include	檔案包含,區分""和<>的區別

#define 定義巨集常量或巨集函式

# 把識別符號轉換成字串

## 合併識別符號

#undef 刪除巨集

#if

#ifndef

#elif

#endif

#error 在編譯期間產生錯誤

#warning 在編譯期間產生警告

#pragma

#pragma gcc dependency 用於監控檔案,防止所依賴的檔案,修改後而不知道

#pragma gcc poison 用於禁用某些識別符號

#pragma pack(n) 設定結構、聯合的補齊和對齊的位元組數

n的值必須比預設的要小

對齊邊界必須是2的較小次方

#line 指定當前行的行號

庫就是目標檔案的集合,我們把不需要公升級維護的**打包合併在一起,方便使用,也可以對源**進行保密。

靜態庫:

靜態庫使用時是把被呼叫的**複製到呼叫模組中,然後在執行程式時,靜態庫就不需要了。

靜態庫的執行速度快。但占用空間大,當庫中的內容發生變化時,需要重新編譯出新的程式,因此不能輕易修改庫的內容。

共享庫:

只是在呼叫模組中嵌入**在庫的相對位置的位址,當執行程式時,共享庫會和程式一起載入到記憶體中,當執行到呼叫共享庫中的**的指令時跳轉到共享中執行,執行完畢後再跳轉回來。

占用空間小,方便更新(共享庫發生變化後程式不需要再次編譯),相對於靜態庫,它的執行效率略低。

靜態庫的擴充套件名為.a,共享庫(動態庫).so

1、建立靜態庫

編寫源**:vi .c/.h

編譯源**:gcc -c ***.c -> ***.o

打包生成靜態庫:ar -r lib***.a x1.o x2.o ...

ar命令的一些引數:

-r 把目標檔案新增到靜態庫中,已經存在的更新

-q 把目標檔案追加到靜態庫的末尾

-d 從靜態庫中刪除目標檔案

-t 現實靜態庫中有哪些目標檔案

-x 把靜態庫拆分成目標檔案

2、呼叫靜態庫

第一種:直接呼叫:呼叫者要和庫在同一路徑下。

gcc main.c lib***.so

第二種:設定環境:設定方法與c_include_path類似

1、開啟vim ~/.bashrc檔案

2、在檔案末尾新增一行

export library_path=$library_path:庫檔案的路徑

4、編譯時要制定庫名

gcc main.c -lmath

第三種:設定編譯引數:-l路徑

gccmain.c -l路徑 -l庫的名字

3、執行

在編譯時已經把被呼叫函式的二進位制複製到可執行檔案中了,在執行時不再需要靜態庫檔案

1、建立共享庫

編寫源**:vi .c/.h

編譯出位置無關的目標檔案:

gcc -c -fpic ***.c -> ***.o

gcc -shared x1.o x2.o x3.o ... -o lib***.so

2、呼叫共享庫:

第一種:直接呼叫:呼叫者要和庫在同一路徑下。

gcc main.c lib***.a

第二種:設定環境:設定方法與c_include_path類似

1、開啟vim ~/.bashrc檔案

2、在檔案末尾新增一行

export library_path=$library_path:庫檔案的路徑

4、編譯時要制定庫名

gcc main.c -lmath

第三種:設定編譯引數:-l路徑

gccmain.c -l路徑 -l庫的名字

3、執行

在使用共享庫時,呼叫者只是記錄了被調**在庫中的位置,因此在執行時需要共享庫同時被載入。

作業系統會根據ld_library_path環境變數的設定來載入共享庫

#include1、載入共享庫

void *dlopen(const char *filename, int flag);

filename:共享庫的庫名,或路徑

flag:

rtld_lazy 使用時才載入

rtld_now 立即載入

返回值:共享庫的控制代碼(類似檔案指標)。

2、獲取識別符號位址並使用

void *dlsym(void *handle, const char *symbol);

handle:共享庫的控制代碼

symbol:識別符號的名字

3、解除安裝共享庫

int dlclose(void *handle);

handle:共享庫的控制代碼。

返回值:成功返回0,失敗返回-1.

4、獲取錯誤資訊

char *dlerror(void);

返回值:會把在使用共享庫時的錯誤,以字串形式返回

nm:檢視目標檔案、可執行檔案、靜態庫、共享庫中的符號列表

ldd:檢視可執行程式所依賴的共享庫有哪些。

strip:**,去除掉目標檔案、可執行檔案、靜態庫和共享庫中的符號資訊、除錯資訊

objdump:顯示二進位制模組的反彙編資訊。

學習第二天筆記

所有識別符號都應該以字母 a z或者a z 美元符號 或者下劃線 開始。首字元之後可以是字母 a z或者a z 美元符號 或者下劃線 或數字的任何字元組合。不能使用關鍵字作為變數名或者方法名。識別符號是大小寫敏感的。合法識別符號舉例 age salary value 1 value 非法識別符號舉例...

Linux學習第二天

今天是第二天在碼神學習,學習的內容感覺很多,認真想想其實也並不是很多吧。可能是因為都是新知識的原因,總被自己關在了外面。對於今天,我現在不看資料還能記得有 1 圖形字元轉換,在我自己的電腦上,圖形轉換字元是 ctrl alt f4,但是字元轉換圖形我試了很多,都不成功,最終以放棄告終。2 檢視cpu...

Linux學習第二天

linux的基本思想第一條就是一切皆檔案,任何的檔案都能夠通過相關的函式來理。linux學習的第二天我對linux的一切皆是檔案有了進一步的認識。linux命令的部分檔案管理命令可以清除的展示乙個檔案是怎樣更具體被建立,它為什麼能夠執行,使用者為什麼能夠閱讀,為什麼能夠對檔案進行修改。乙個程式能夠執...