動態鏈接庫是程序運行時加載的庫,當動態鏈接庫正確部署之后,運行的多個程序可以使用同一個加載到內存中的動態庫,因此在 Linux 中動態鏈接庫也可稱之為共享庫。動態鏈接庫是目標文件的集合,目標文件在動態鏈接庫中的組織方式是按照特殊方式形成的。庫中函數和變量的地址使用的是相對地址(靜態庫中使用的是絕對地址),其真實地址是在應用程序加載動態庫時形成的。
關於動態庫的命名規則如下:
1)在 Linux 中動態庫以 lib 作為前綴,以.so 作為后綴,中間是庫的名字自己指定即可,即: libxxx.so
2)在 Windows 中動態庫一般以 lib 作為前綴,以 dll 作為后綴,中間是庫的名字需要自己指定,即: libxxx.dll
生成動態鏈接庫是直接使用 g++ 命令並且需要添加 -fPIC(-fpic) 以及 -shared 參數。
1)-fPIC 或 -fpic 參數的作用是使得 g++ 生成的代碼是與位置無關的,也就是使用相對位置。
2)-shared參數的作用是告訴編譯器生成一個動態鏈接庫。
生成動態鏈接庫的具體步驟如下:
一、將源文件進行匯編操作,需要使用參數 -c, 還需要添加額外參數 -fpic /-fPIC,得到若干個 .o文件:
$ g++ 源文件(*.cpp) -c -fpic
二·、將得到的.o 文件打包成動態庫,還是使用 g++, 使用參數 -shared 指定生成動態庫 (位置沒有要求)
$ g++ -shared 與位置無關的目標文件(*.o) -o 動態庫(libxxx.so)
三、發布動態庫和頭文件
1)提供頭文件: xxx.h
2)提供動態庫: libxxx.so
四、動態庫的使用
當我們得到了一個可用的動態庫之后,需要將其放到一個目錄中,然后根據得到的頭文件編寫測試代碼,對動態庫中的函數進行調用。
1)拿到發布的動態庫
`head.h libcalc.so
2)基於頭文件編寫測試程序, 測試動態庫中提供的接口是否可用
`main.cpp`
3)編譯測試程序
$ g++ main.cpp -o app