linux 靜態庫,動態庫簡單使用示例

2021-09-24 16:31:47 字數 1657 閱讀 4731

nm 命令可以看二進位制檔案的符號

預編譯 去掉巨集 gcc -e hello.c -o hello.i

編譯 高階語言-->彙編  gcc -s hello.i

彙編 彙編-->目標檔案  gcc -c hello.s

鏈結    gcc hello.o -o hello

.h 原始碼標頭檔案

.c 預處理前的原始碼

.i 預處理後的原始碼

.s 組合語言檔案

.o 目標檔案

.a 靜態庫

.so 共享庫

gcc [選項引數] 檔案

-c 只編譯不鏈結

-o 指定輸出檔案

-e 預編譯

-s 產生彙編

-wall 產生盡可能多的警告

-pedantic 對不符合ansi/iso c語言標準的擴充套件語法產生警告

-werror 將警告作為錯誤處理

-x 指定源**語言 gcc -x c++ cpp.c -lstdc++

-g 生成除錯資訊

-d 定義巨集  gcc -dversion=3

-o1/o2/o3  優化等級

gcc -i選項指定檔案件附加搜尋路徑

標頭檔案查詢順序

#include <> -i目錄,系統目錄

#include "" -i目錄,當前目錄,系統目錄

## //連線巨集內兩個連續的字串  #define var(x) var##x   var(1)也就是var1

# //將巨集引數擴充套件成字串字面值 #define str(s) #s   printf(str(wang));

環境變數:

c_include_path  - c標頭檔案的附加搜尋路徑,相當於gcc的-i路徑

cpath 與c_include_path一樣

cplus_include_path c++標頭檔案的附加搜尋路徑

export cpath=$cpath:.

export含義保證當前shell的子程序可以使用這個環境變數(子程序繼承此

環境變數)。

shell中所啟動的任何程序都是shell的子程序

~/.bashrc或者~/.bash_profile

靜態庫ar -r lib***.a ***.o ...

示例:gcc -c calc.c

gcc -c show.c

ar -r libmath.o calc.o show.o

gcc main.c -lmain -l.

gcc main.c libmain.a也可以

-l指定庫搜尋路徑,-l指定庫名

library_path 庫的搜尋路徑(給鏈結器gcc用的)

export library_path=$library_path:.

最一般方法:

gcc .c/.o -l《庫名》 -l《庫路徑》

動態庫:

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

-fpic:位置無關**,可執行程式載入它們時,可將其對映到其位址空間的

任何位置。

gcc -shared ***.o ***.o -o libmath.so

gcc main.c -lmath -l.   注:預設先找共享庫

ld_library_path:共享庫載入時候的路徑(給載入器用的)

linux 靜態庫 動態庫

1.概念和區別 靜態庫就是在編譯過程中一些目標檔案的集合。靜態庫在程式鏈結的時候使用,鏈結器會將程式中使用到函式的 從庫檔案中拷貝到應用程式中。一旦鏈結完成,在執行程式的時候就不需要靜態庫了。由於每個使用靜態庫的應用程式都需要拷貝所用函式的 所以靜態鏈結的檔案會比較大。相對於靜態函式庫,動態函式庫在...

linux 靜態庫 動態庫

linux支援兩種庫的型別 靜態庫和動態庫 共享庫 1.linux靜態庫和動態庫的命名規則 靜態函式庫 lib a 動態函式庫 lib so 這些庫檔案都是由 o檔案生成的 動態庫 程式執行過程中進行連線。可執行檔案 庫檔案 靜態庫 編譯時進行連線。庫檔案 的複製貼上過程。程式執行時先檢查依賴的庫檔...

Linux動態庫,靜態庫

1.庫是什麼?庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。就是將源 轉化為二進位制格式的源 相當於進行了加密,別人可以使用庫,但是看不到庫中的內容。2.靜態庫 靜態函式庫時在程式執行之前 編譯 就加入到目標程式中去了 linux中命名系統中靜態庫庫的規則 靜態庫檔名的命名方式是 l...