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

標題: Linux下編譯動態鏈接庫 [打印本頁]

作者: 51黑tt    時間: 2016-3-5 17:41
標題: Linux下編譯動態鏈接庫
由于動態鏈接庫函數的共享特性,它們不會被拷貝到可執行文件中。在編譯的時候,編譯器只會做一些函數名之類的檢查。在程序運行的時候,被調用的動態鏈接庫函數被安置在內存的某個地方,所有調用它的程序將指向這個代碼段。因此,這些代碼必須實用相對地址,而不是絕對地址。在編譯的時候,我們需要告訴編譯器,這些對象文件是用來做動態鏈接庫的,所以要用地址不無關代碼(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






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 51ⅴ精品国产91久久久久久 | 日韩一区二区视频 | 午夜三区 | 黄色网址av | 欧美一a | 亚洲一区二区 | 日日夜夜天天 | 久久久久一区二区三区 | 亚洲免费在线 | 欧美中文字幕在线观看 | 亚洲美女视频 | 欧美xxxx黑人又粗又长 | 日韩精品免费一区二区在线观看 | 99re在线免费视频 | 亚洲欧洲成人在线 | 一区视频在线 | 亚洲不卡在线视频 | 国产精品一区二区av | 国产精品久久久久久久久久久久 | 香蕉大人久久国产成人av | 国产欧美精品在线 | 99久久婷婷国产综合精品电影 | 91精品久久久久久久99 | 亚洲人成人一区二区在线观看 | 91网站在线看 | 亚洲乱码国产乱码精品精的特点 | 欧美一区二区小视频 | 国产内谢 | 国产一区久久 | 日本中文在线 | 日本一区二区高清不卡 | 日韩精品一区二区三区中文在线 | 国产精品夜夜春夜夜爽久久电影 | 99精品国自产在线观看 | 黑色丝袜三级在线播放 | 国产精品一区一区 | 一级欧美视频 | 最新国产在线 | 欧美黑人体内she精在线观看 | 一区二区成人 | 日韩在线观看视频一区 |