學習筆記,小白可以相互學習,大佬看到能告訴咱理解不對的地方就好了。
庫的概念:
從本質上來說庫就是一種可執行代碼的二進制形式,可被操作系統載入內核執行。
linux和windows本質不同,二者庫的二進制是不兼容的。
1.靜態庫
靜態庫在程序編譯時纔會被連接到目標代碼中,程序運行時不需要該靜態庫,因此體積較大。
優點:靜態庫對函數庫的鏈接是放在編譯時期完成的,程序運行時與函數庫沒關係,移植方便。
缺點:浪費空間和資源,因爲所有相關的對象文件與牽涉到的函數庫被鏈接合成一個可執行文件。
1.1創建靜態庫
創建靜態庫使用ar命令,它將很多.o轉換成.a
a. gcc -c hello.c (生成hello.o文件(目標文件))
b. ar crs libmyhello.a hello.o(把目標文件生成庫,myhello是庫名)
靜態庫的命名規範是以lib爲前綴,緊接着接靜態庫名,擴展名爲.a
c. gcc -o hello main.c -L -lmyhello(編譯時記得鏈接庫)
2.動態庫
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行時才被載入。動態庫把對一些函數的鏈接載入延遲到程序運行的時期。
優點:可以實現進程之間的資源共享,將一些程序的升級變得簡單,甚至可以做到鏈接載入完全由程序員在程序代碼中控制。
2.1創建動態庫
a. gcc -fPlC -Wall -c hello.c(生成目標文件)
b. gcc -shared -o libmyhello.so hello.o(生成庫文件)
動態鏈接庫的名字形式爲“libxxx.so”,後綴名爲.so
2.2使用動態庫的方法
1.cp limyhello.so /usr/lib/(直接把庫拷貝到/usr/lib目錄下)
2.在LD_LIBRARY_PATH環境變量中加上庫所在路徑
設置路徑:export LD_LIBRARY_PATH = /home/farsight/hello(這個是庫所在的目錄路徑,可使用命令pwd查看當前路徑)
再gcc test.c -lmyhello -L就可以了
3.添加/etc/ld.so.conf.d/*.conf文件,把庫所在路徑加到文件末尾,並執行ldconfig刷新
建立sudo vim /etc/ld.so.conf.d/*.conf 文件
再sudo ldconfig刷新
再gcc test.c -lmahello -L編譯
最後直接./a.out執行就可了
ldd命令可以查看一個可執行程序依賴的共享庫
#ldd /bin/inlibc.so.6