日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Linux系统编程学习】 动态库的制作与使用

發布時間:2023/11/30 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux系统编程学习】 动态库的制作与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此為??途WLinux 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可執行文件,可以執行。

總結

以上是生活随笔為你收集整理的【Linux系统编程学习】 动态库的制作与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。