學習筆記,小白可以相互學習,大佬看到能告訴咱理解不對的地方就好了。
庫的概念:
從本質上來說庫就是一種可執行**的二進位制形式,可被作業系統載入核心執行。
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(生成庫檔案)
動態鏈結庫的名字形式為「lib***.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
Linux靜態庫和動態庫的分析
庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如 libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,通常使用建立符號連線的方...
關於Linux靜態庫和動態庫的分析
庫有動態與靜態兩種,動態通常用.so 為字尾,靜態用 a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾 例如 libhello.so.1.0,由於程式連線預設以 so為檔案字尾名。所以為了使用這些庫,通常使用建立符號連線的...
動態庫 版本 iOS 靜態庫 動態庫分析
ios開發中靜態庫和動態庫區別 靜態庫和動態庫是相對編譯期和執行期的 靜態庫在程式編譯時會被鏈結到目標 中,程式執行時將不再需要改靜態庫 而動態庫在程式編譯時並不會被鏈結到目標 中,只是在程式執行時才被載入,因為在程式執行期間還需要動態庫的存在。靜態庫 好處 模組化,分工合作,提高了 的復用及核心技...