庫函式(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 ...