1.什麼是庫
在windows平臺和linux平臺下都大量存在着庫。
本質上來講庫是一種可執行代碼的二進制形式,能夠被操做系統載入內存執行。
因爲windows和linux的本質不一樣,所以兩者庫的二進制是不兼容的。
本文僅限於介紹linux下的庫linux
2.庫的種類
linux下的庫有兩種:靜態庫和共享庫(動態庫)。windows
兩者的不一樣點在於代碼被載入的時刻不一樣。
靜態庫的代碼在編譯過程當中已經被載入可執行程序,所以體積較大。
共享庫的代碼是在可執行程序運行時才載入內存的,在編譯過程當中僅簡單的引用,所以代碼體積較小。函數
3.庫存在的意義
庫是別人寫好的現有的,成熟的,能夠複用的代碼,你可使用但要記得遵照許可協議。
現實中每個程序都要依賴不少基礎的底層庫,不可能每一個人的代碼都從零開始,所以庫的存在乎義非同尋常。共享庫的好處是,不一樣的應用程序若是調用相同的庫,那麼在內存裏只須要有一份該共享庫的實例。spa
4.庫文件是如何產生的在linux下
靜態庫的後綴是.a,它的產生分兩步
Step 1.由源文件編譯生成一堆.o,每一個.o裏都包含這個編譯單元的符號表
Step 2.ar命令將不少.o轉換成.a,成文靜態庫
動態庫的後綴是.so,它由gcc加特定參數編譯產生。
例如:
$ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.操作系統
5.庫文件是如何命名的,有沒有什麼規範
在linux下,庫文件通常放在/usr/lib和/lib下,
靜態庫的名字通常爲libxxxx.a,其中xxxx是該lib的名稱
動態庫的名字通常爲libxxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號, minor是副版本號命令行
6.如何知道一個可執行程序依賴哪些庫
ldd命令能夠查看一個可執行程序依賴的共享庫,
例如# ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
能夠看到ln命令依賴於libc庫和ld-linux庫orm
7.可執行程序在執行的時候如何定位共享庫文件
當系統加載可執行代碼時候,可以知道其所依賴的庫的名字,可是還須要知道絕對路徑
此時就須要系統動態載入器(dynamic linker/loader)
對於elf格式的可執行程序,是由ld-linux.so*來完成的索引
它前後搜索elf文件的 DT_RPATH段—環境變量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib目錄內存
找到庫文件後將其載入內存ci
8.在新安裝一個庫以後如何讓系統可以找到他
若是安裝在/lib或者/usr/lib下,那麼ld默認可以找到,無需其餘操做。
若是安裝在其餘目錄,須要將其添加到/etc/ld.so.cache文件中,步驟以下
1.編輯/etc/ld.so.conf文件,加入庫文件所在目錄的路徑
2.運行ldconfig,該命令會重建/etc/ld.so.cache文件
############################################################
linux中編譯靜態庫(.a)和動態庫(.so)的基本方法
靜態庫 在linux環境中, 使用ar命令建立靜態庫文件.以下是命令的選項: ar 命令的命令行格式以下: 好比建立一個靜態庫文件的命令以下: 使用ranlib程序建立庫的索引,索引存放在庫文件內部. 用nm程序顯示存檔文件的索引,它能夠顯示目標文件的符號
動態庫
通常應用程序的庫文件不與系統庫文件放在同一個目錄下,通常把應用程序的共享庫文件放在/usr/local/lib下,新建一個屬於本身的目錄apue,而後把剛纔libapue.so複製過去就好了 /* 參數的配置經過man gcc能夠看到 -llibrary 鏈接名爲 library 的 庫文件. 鏈接器 在 標準搜索目錄 中 尋找 這個 庫文件, 庫文件 的 真正 名 字 |