動態鏈結庫 靜態鏈結庫

2021-09-07 01:51:29 字數 1665 閱讀 1502

包含標頭檔案和庫:

-idir:  指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例:gcc test.c –i../inc -o test。

-ldir :  指定鏈結時查詢lib的目錄,常用於查詢第三方庫。

-llibrary 指定額外鏈結的lib庫

巨集定義

-dmacro 以字串"1"(預設值)定義 macro 巨集。

-dmacro=defn 以字串"defn"定義macro 巨集,注意中間不能有空格。

-umacro 取消對 macro 巨集的定義。

除錯和可執行檔案形式:

-g 指示編譯器,在編譯的時產生除錯資訊。

-ggdb 盡可能的生成gdb的可以使用的除錯資訊(比-g生成的資訊更多些)。

-static 禁止使用動態庫,編譯得到的程式會比較大,但可以自由執行。

-share 盡量使用動態庫,所以生成檔案比較小,但是需要系統由動態庫。

告警選項

-wall 產生盡可能多的警告資訊,建議始終帶上

-werror 將所有的警告當成錯誤進行處理

靜態鏈結庫:

1.通過gcc –c命令將stack.c編成stack.o

gcc -c stack.c

2.通過ar命令將stack.o封裝成libstack.a

ar cr libstack.a stack.o #多個.o打包成.a檔案

3.鏈結

gcc -o run main.c -l.(庫目錄) -lstack(庫)

庫名: libstack.a

庫:stack(去掉lib和字尾得到)

#可以合併多個.o檔案

ar cr libtest.a first.o second.o third.o

#檢視打包了哪些.o檔案

ar -t ***.a

#動態鏈結庫

1.通過gcc –c命令將stack.c編成stack.o

gcc -c stack.c

2. gcc -shared -o libstack.so stack.o

3.鏈結

gcc -o run main.c -l.(庫目錄) -lstack(庫)

gcc -o run main.c -l. -lstack

gcc -o run main.c -l. -lstack -wl,-rpath,dir1

4.指定動態鏈結庫的位址

export ld_library_path=$ld_library_path:.

5.執行

./run

#檢視需要的動態鏈結庫

ldd run

#動態鏈結庫搜尋目錄

1. 環境變數 ld_library_path

2. 從/etc/ld.so.conf找(用ldconfig重新整理快取)

3. 預設的系統路徑, 先是/lib(/lib64)然後是/usr/lib (/usr/lib64)

4. 還可以編譯時指定搜尋路徑

-wl,-rpath,dir1:dir2:...:dirn (多個冒號間隔)

#ldconfig -v | grep b.so

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...