此為牛客網Linux C++課程1.6&1.7 的課程筆記。
1. 動態庫命名規則
2. 動態庫的制作
第一步,用gcc編譯生成.o目標文件,注意要用-fpic參數生成與位置無關的代碼;
第二步,用gcc的-shared參數生成動態庫。
涉及到的兩個參數之前學過:
代碼演示:
一個簡易版計算器程序目錄如下:
然后執行:
gcc -c -fpic add.c div.c mult.c sub.c
用gcc編譯成與位置無關的.o目標文件
然后執行:
gcc -shared add.o div.o mult.o sub.o -o libcalc.so
生成了名為libcalc.so的動態庫文件。
3. 動態庫的使用
文件目錄如下:
有了上節課的報錯鋪墊,這次很容易地知道使用哪些參數,執行:
gcc main.c -o main -I ./include/ -L ./lib -l calc
生成了可執行文件main,然后執行
./main
結果報錯:
加載動態庫出錯,找不到動態庫文件。
這一錯誤的產生與動態庫的原理有關。
動態庫與靜態庫不同,動態庫的代碼不會被打包到可執行程序中,而是當程序運行時使用到庫時,需要系統動態載入器獲取動態庫的絕對路徑,然后把動態庫加載到內存中。對于elf格式的可執行程序,是由ld-linux.so*來完成的,它先后搜索elf文件的 DT_RPATH段—>環境變量LD_LIBRARY_PATH—>/etc/ld.so.cache文件列表—>/lib/,/usr/lib 目錄找到庫文件后將其載入內存。
我們這里可以使用ldd命令來查看main中的動態庫依賴關系,執行:
ldd main
結果如下:
列出了動態庫的名稱、路徑和內存地址,可見libcalc.so沒有找到。
如何讓系統能夠找到它:
如果安裝在/lib或者/usr/lib下,那么ld默認能夠找到,無需其它操作。
如果安裝在其它目錄,需要將其添加到/etc/ld.so.cache文件中,步驟如下:
- 編輯/etc/ld.so.conf文件,加入庫文件所在目錄的路徑;
- 運行ldconfig ,該命令會重建/etc/ld.so.cache文件。
我們將創建的動態庫復制到/usr/lib下面,執行:
sudo cp libcalc.so /usr/lib
然后運行main可執行文件,可以執行。