C語言編輯鏈結

2022-06-17 04:24:13 字數 2342 閱讀 2965

庫函式(library files)

庫函式就是函式的倉庫,它們都經過編譯,重用性不錯。通常,庫函式相互合作,來完成特定的任務。比如操控螢幕的庫函式(cursers和ncursers庫函式),資料庫讀取庫函式(dbm庫函式)等。

系統呼叫的標準庫函式一般位於/lib以及/usr/lib。c編譯器(精確點說,聯結器)需要知道庫函式的位置。預設情況下,它只搜尋標準c庫函式。

庫命名格式

庫函式檔案通常開頭字母是lib。後面的部分標示庫函式的用途(比如c庫函式用c標識, 數學庫函式用m標示),小數點後的字尾表明庫函式的型別:

.a 指靜態鏈結庫

.so 指動態鏈結庫

比如下面的mysql軟體lib目錄下的鏈結庫

[root@itoracle lib]# ll |grep mysqlclient

-rw-r--r-- 1 mysql mysql 24878526 apr 8

2018

libmysqlclient.a

lrwxrwxrwx

1 mysql mysql 20 apr 8

2018 libmysqlclient.so -> libmysqlclient.so.21

lrwxrwxrwx

1 mysql mysql 25 apr 8

2018 libmysqlclient.so.21 -> libmysqlclient.so.21.0.11

-rwxr-xr-x 1 mysql mysql 10876320 apr 8

2018 libmysqlclient.so.21.0.11

共享鏈結庫(shared libraries)

靜態鏈結庫的乙個缺點是,如果我們同時執行了許多程式,並且它們使用了同乙個庫函式,這樣,在記憶體中會大量拷貝同一庫函式。這樣,就會浪費很多珍貴的記憶體和儲存空間。使用了共享鏈結庫的linux就可以避免這個問題。

共享函式庫和靜態函式在同乙個地方,只是字尾有所不同。比如,在乙個典型的linux系統,標準的共享數序函式庫是/usr/lib/libm.so。

當乙個程式使用共享函式庫時,在連線階段並不把函式**連線進來,而只是鏈結函式的乙個引用。當最終的函式匯入記憶體開始真正執行時,函式引用被解析,共享函式庫的**才真正匯入到記憶體中。

這樣,共享鏈結庫的函式就可以被許多程式同時共享,並且只需儲存一次就可以了。也常稱為動態鏈結庫。

共享函式庫的另乙個優點是,它可以獨立更新,與呼叫它的函式毫不影響。契合了解耦的思想。

linux動態鏈結庫位置

linux系統動態庫預設位置為 /lib and /usr/lib, by default

動態鏈結庫示例

vim myfunc.c

#include

int getnum()

gcc -c -fpic myfunc.c

gcc -shared -fpic -o libmyfunc.so myfunc.o

mkdir /usr/local/mylib

cp libmyfunc.so /usr/local/mylib/

在環境變數中新增自定義lib庫的位置

export ld_library_path=/usr/local/mylib:$ld_library_path

vim chk.c

#include

int main()

gcc -c chk.c

gcc -o chk chk.o -l. -lmyfunc    #-l查詢範圍為當前目錄 -l動態鏈結庫名

./chk

return value is 5

標頭檔案(head files)

在c語言和其他語言中,標頭檔案宣告了系統函式和庫函式,並且定義了一些常量。對於c語言,標頭檔案基本上散落於/usr/include和它的子資料夾下。其他的程式語言的庫函式分布在編譯器定義的地方,

比如在一些linux版本中,x window系統庫函式分布在/usr/include/x11,gnu c++的庫函式分布在/usr/include/g++。這些系統庫函式的位置對於編譯器來說都是「標準位置」,即編譯器能夠自動搜尋這些位置。

如果想引用位於標準位置之外的標頭檔案,我們需要在呼叫編譯器的時候加上-i標誌,來顯式的說明標頭檔案所在資料夾。比如,

$ gcc -i/usr/openwin/include hello.c

會告訴編譯器除了標準位置外,還要去/usr/openwin/include看看有沒有所需的標頭檔案。詳細情況見編譯器的使用手冊(man gcc)。

C語言筆記 鏈結

1 將c原始檔編譯成可執行檔案的過程 1 編譯器驅動程式 compiler driver 執行預處理器,將c原始檔翻譯成乙個中間檔案 i 2 編譯器驅動程式 compiler driver 執行編譯器,將.i 檔案翻譯成乙個組合語言檔案.s 3 編譯器驅動程式 compiler driver 執行彙...

C語言編譯與鏈結

預處理過程主要處理那些源 檔案只能夠的以 開始的預編譯指令。比如 include define 等,主要處理規則如下 1 將所有的 define 刪除,並且展開所有的巨集定義 2 處理所有條件預編譯指令,比如 if ifdef elif else endif 3 處理 include 預編譯指令,將...

C語言鏈結Mysql,mysql API簡單說明。

include include include char host char user char password char name short port 3306 int main else if 0 mysql real query conn,select,strlen select res ...