靜態庫命名規則
靜態庫檔案命名為lib***.a
lib為固定字首
***為庫的名字,庫名字內容長度自己定。注意庫的名字和庫檔案名字是兩個東西
.a為固定的庫檔案字尾
靜態庫的製作與使用
靜態庫**的編寫
class
cmath
;
將**檔案編譯成目標檔案.o
g++ -c math.cpp
注意帶引數-c,否則直接編譯為可執行檔案
通過ar工具將目標檔案打包成.a靜態庫檔案
ar -crv libmath.a matho
生成靜態庫libmath.a
使用靜態庫
#include
"math.h"
#include
using
namespace std;
intmain()
linux下使用靜態庫,只需要在編譯的時候,指定靜態庫的搜尋路徑(-l選項)、指定靜態庫名(不需要lib字首和.a字尾,-l選項)
g++ test.cpp -l./ -lmath -o test
-l:表示要連線的庫所在目錄
linux動態庫的命名規則
動態鏈結庫的名字形式為 lib***.so,字首是lib,字尾名為「.so」
動態庫的**編寫
class
cmath
;
建立動態庫
生成目標檔案,此時要加編譯器選項-fpic
g++ -fpic -c math.cpp
-fpic 建立與位址無關的編譯程式(pic,position independent code),是為了能夠在多個應用程式間共享
生成動態庫,此時要加鏈結器選項-shared
g++ -shared -o limath.so math.o
其實上面兩個步驟可以合併為乙個命令:
g++ -fpic -shared -o libmath.so math.cpp
使用動態庫
#include
"math.h"
#include
using
namespace std;
intmain()
g++ test.cpp -l./ -lmath -o test
執行
sh-4.2# ./test
./test: error while loading shared libraries: libmath.so: cannot open shared object file: no such file or directory
在執行的時候是如何定位共享庫檔案的呢?
當系統載入可執行**時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑。此時就需要系統動態載入器(dynamic linker/loader)。
對於elf格式的可執行程式,是由ld-linux.so*來完成的,它先後搜尋elf檔案的 dt_rpath段—環境變數ld_library_path—/etc/ld.so.cache檔案列表—/lib/,/usr/lib 目錄找到庫檔案後將其載入記憶體。
如何讓系統能夠找到它:
l 如果安裝在/lib或者/usr/lib下,那麼ld預設能夠找到,無需其他操作。
l 如果安裝在其他目錄,需要將其新增到/etc/ld.so.cache檔案中,步驟如下:
n 執行ldconfig ,該命令會重建/etc/ld.so.cache檔案
我們將建立的動態庫複製到/usr/lib下面,然後執行測試程式
#include ,提供了下面幾個介面:
linux 靜態庫和動態庫
1.生成方式 靜態庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 然後生成靜態庫 ar rc libstatic.a test.o 共享庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 生成共享庫 gcc fpic shared o libsha...
Linux 靜態庫和動態庫
庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的include標頭檔案。我們先來回顧一下程式編譯的過程。如下圖 庫 本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫 缺點是 檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大 下面實現乙個靜態...
Linux 靜態庫和動態庫
我們指定c程式從 到乙個可執行程式需要經過預處理 編譯 彙編 鏈結。而最後一步鏈結又分為動態鏈結與靜態鏈結。靜態鏈結相當於就是講所要鏈結的庫提前放入鏈結的檔案,這樣子的檔案體積較大,但是可移植性較高。而動態鏈結是在執行的時候才去主動鏈結所需要鏈結的庫,這樣的 體積較小,多個程式共同使用庫的 我們li...