久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1541|回復: 0
打印 上一主題 下一主題
收起左側

Linux下編譯動態鏈接庫

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 2016-3-5 17:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
由于動態鏈接庫函數的共享特性,它們不會被拷貝到可執行文件中。在編譯的時候,編譯器只會做一些函數名之類的檢查。在程序運行的時候,被調用的動態鏈接庫函數被安置在內存的某個地方,所有調用它的程序將指向這個代碼段。因此,這些代碼必須實用相對地址,而不是絕對地址。在編譯的時候,我們需要告訴編譯器,這些對象文件是用來做動態鏈接庫的,所以要用地址不無關代碼(Position Independent Code (PIC))。
對gcc編譯器,只需添加上 -fPIC 標簽,如:
gcc -fPIC -c file1.c
gcc -fPIC -c file2.c
gcc –shared -o libxxx.so file1.o file2.o
注意到最后一行,-shared 標簽告訴編譯器這是要建立動態鏈接庫。這與靜態鏈接庫的建立很不一樣,后者用的是 ar 命令。也注意到,動態鏈接庫的名字形式為 “libxxx.so” 后綴名為 “.so”

四、動態鏈接庫的使用
使用動態鏈接庫,首先需要在編譯期間讓編譯器檢查一些語法與定義。
這與靜態庫的實用基本一樣,用的是 -Lpath 和 -lxxx 標簽。如:
gcc file1.o file2.o -Lpath -lxxx -o program.exe
編譯器會先在path文件夾下搜索libxxx.so文件,如果沒有找到,繼續搜索libxxx.a(靜態庫)。

選項的意義:
      -shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件
l       -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
l       -L.:表示要連接的庫在當前目錄中
l       -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
l       LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。


鏈接方法I,拷貝到系統庫里再鏈接,讓gcc自己查找
$ sudo cp lib***.so /usr/lib   

鏈接方法II,手動指定庫路徑
gcc file1.o file2.o -Lpath -lxxx -o program.exe

鏈接方法III,修改環境變量
$ export LD_LIBRARY_PATH=/path/to/lib

$ ldd test
執行test,可以看到它是如何調用動態庫中的函數的。
Ldd:判斷某個可執行的 binary 檔案里有什么動態函式庫:

比靜態鏈接的程序多了一個 lib***.so ?恩,這就是靜態與動態的最大區別,靜態情況下,他把庫直接加載到程序里,而在動態鏈接的時候,他只是保留接口,將動態庫與程序代碼獨立。這樣就可以提高代碼的可復用度,和降低程序的耦合度。

ldconfig和etc/ld.so.conf:將動態凼式庫加載高速緩存當中:
首先,我們必須要在 /etc/ld.so.conf 里面寫下『 想要讀入高速緩存當中的動態凼式庫所在的目錄』,接下來則是利用 ldconfig 這個執行檔將 /etc/ld.so.conf 的資料讀入快取當中;

當執行函數動態鏈接.so時,如果此文件不在缺省目錄下‘/usr/local/lib’ and ‘/usr/lib’.   那么就需要指定環境變量LD_LIBRARY_PATH:該環境變量主要用于指定查找動態鏈接庫時除了默認路徑之外的其他路徑。(該路徑在默認路徑之前查找)
假如現在需要在已有的環境變量上添加新的路徑名,則采用如下方式
LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路徑串)

在linux終端下輸入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/au1200_rm/build_tools/bin
然后再輸入:export,即會顯示是否設置正確
多個路徑之間用冒號分隔;例如:
# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"


而PATH是執行文件路徑的變量
PATH=${PATH}:add_yours
export PATH=${PATH}:add_yours

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91九色在线观看 | 国产网站在线播放 | www中文字幕 | 一级黄色生活视频 | 亚洲国产欧美在线 | 国产分类视频 | 五月激情婷婷在线 | 免费观看一级视频 | 亚洲精品乱码久久久久久9色 | 中文字幕一区二区三区四区 | 黄色免费av | 婷婷开心激情综合五月天 | 国产日韩欧美在线观看 | 日本在线免费视频 | 欧美专区在线观看 | 久久一区二区三区四区五区 | 国产精品免费观看 | 精品一区国产 | 成年人视频在线免费观看 | 国产色 | 久久成人av| 久久国产精彩视频 | 精品一区二区久久久久久久网站 | 亚洲播放 | 成人在线播放网站 | 欧美一区二区三区一在线观看 | 99免费精品视频 | 黄网站涩免费蜜桃网站 | 男人的天堂久久 | 欧美 中文字幕 | 免费精品| 黄色一级视频免费 | 一区二区在线不卡 | 久久不射网 | 久久99精品国产99久久6男男 | 天天干天天干 | 日本久久精品视频 | 日韩欧美大片 | 精品久久久久久久久久久久久 | 拍真实国产伦偷精品 | 精品九九 |