青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-167  評論-8  文章-0  trackbacks-0
一、引言
通常情況下,對函數庫的鏈接是放在編譯時期(compile time)完成的。所有相關的對象文件(object file)與牽涉到的函數庫(library)被鏈接合成一個可執行文件(executable file)。程序在運行時,與函數庫再無瓜葛,因為所有需要的函數已拷貝到自己門下。所以這些函數庫被成為靜態庫(static libaray),通常文件名為“libxxx.a”的形式。

其實,我們也可以把對一些庫函數的鏈接載入推遲到程序運行的時期(runtime)。這就是如雷貫耳的動態鏈接庫(dynamic link library)技術。

二、動態鏈接庫的特點與優勢

首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處:

1. 可以實現進程之間的資源共享。

什么概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些“動態鏈接”額外的開銷,卻大大的節省了系統的內存資源。C的標準庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標準庫的代碼段。

2. 將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows 就是一個很好的例子。

3. 甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。

程序員在編寫程序的時候,可以明確的指明什么時候或者什么情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟件,但每次運行的時候,由于不同的操作需求,只有一小部分程序被載入內存。所有的函數本著“有需求才調入”的原則,于是大大節省了系統資源。比如現在的軟件通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以后再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然后才發覺在整個程序中根本沒有用到它們。

三、動態鏈接庫的創建

由于動態鏈接庫函數的共享特性,它們不會被拷貝到可執行文件中。在編譯的時候,編譯器只會做一些函數名之類的檢查。在程序運行的時候,被調用的動態鏈接庫函數被安置在內存的某個地方,所有調用它的程序將指向這個代碼段。因此,這些代碼必須實用相對地址,而不是絕對地址。在編譯的時候,我們需要告訴編譯器,這些對象文件是用來做動態鏈接庫的,所以要用地址不無關代碼(Position Independent Code (PIC))。

對gcc編譯器,只需添加上 -fPIC 標簽,如:

gcc -fPIC -c file1.c
gcc -fPIC -c file2.c
gcc -shared 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(靜態庫)。

在程序運行期間,也需要告訴系統去哪里找你的動態鏈接庫文件。在UNIX下是通過定義名為 LD_LIBRARY_PATH 的環境變量來實現的。只需將path賦值給此變量即可。csh 命令為:

setenv LD_LIBRARY_PATH your/full/path/to/dll

一切安排妥當后,你可以用 ldd 命令檢查是否連接正常。

ldd program.exe

編譯參數解析

最主要的是GCC命令行的一個選項:
-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件

l -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

l -L.:表示要連接的庫在當前目錄中

l -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱

l LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。

l 當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用 /sbin/ldconfig來達到同樣的目的,不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。
4、注意

調用動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的頭文件所在目錄 通過 “-I” include進來了,庫所在文件通過 “-L”參數引導,并指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈接的so文件,這時你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了。

五、靜態庫的創建和使用:


1、生成靜態庫 :庫名 libmylib.a

ar rcs libmylib.a mylib.o

2、將靜態庫copy到 /usr/lib/ 或/lib/ 目錄下

cp libmylib.a /usr/lib/

3、靜態庫的使用

比如測試文件為test.c

gcc -0 test test.c -lmylib

-l為選項, mylib為庫名。mylib為libmylib的中間部分,Linux下約定所有庫都以前綴lib開始

靜態庫以.a結尾,動態庫以.so結尾。再編譯程式時,無需帶上前綴和后綴。

注意:靜態庫的命名需要以"lib"開頭,否者連接是編譯器無法找到庫
posted on 2009-07-21 13:34 老馬驛站 閱讀(249) 評論(0)  編輯 收藏 引用 所屬分類: linux
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲每日更新| 国产精品国产三级国产普通话三级| 国产精品视频成人| 亚洲午夜在线视频| 亚洲新中文字幕| 国产精品日韩高清| 久久国产一区二区| 久久午夜精品一区二区| 亚洲精品黄网在线观看| 亚洲人成7777| 欧美性视频网站| 久久国产精品黑丝| 美女诱惑一区| 亚洲一区二区在线视频 | 在线免费高清一区二区三区| 美国成人毛片| 欧美激情精品久久久久| 99精品视频免费全部在线| 在线视频亚洲一区| 国产一区久久| 亚洲青涩在线| 国产日韩精品视频一区二区三区| 免费久久精品视频| 欧美日韩久久久久久| 久久福利毛片| 欧美大片18| 欧美中文字幕精品| 欧美激情精品久久久| 久久国产精品一区二区| 免费91麻豆精品国产自产在线观看| 亚洲天堂成人| 免费成人黄色片| 亚洲欧美日韩天堂| 欧美xxxx在线观看| 校园激情久久| 欧美日韩国产成人在线免费| 久久gogo国模啪啪人体图| 欧美高清在线一区| 欧美一区二区视频在线观看2020 | 美女在线一区二区| 午夜精品一区二区三区四区| 免费成人性网站| 久久激情网站| 国产精品爱啪在线线免费观看| 欧美成人dvd在线视频| 国产精品视频免费观看| 亚洲日本一区二区三区| 国产午夜精品久久久久久久| 日韩特黄影片| 亚洲精品自在在线观看| 久久久久久久国产| 久久er精品视频| 国产精品任我爽爆在线播放 | 亚洲制服欧美中文字幕中文字幕| 久久精品国产2020观看福利| 亚洲欧美日韩国产精品| 欧美视频在线免费| 亚洲另类黄色| 99视频精品全部免费在线| 欧美高清不卡在线| 欧美成人蜜桃| 一区视频在线| 久久久久一区二区三区| 久久精品在线视频| 国产精品视频成人| 亚洲你懂的在线视频| 亚洲视频第一页| 欧美视频日韩视频| 在线一区二区三区做爰视频网站| 日韩视频免费看| 欧美女主播在线| 亚洲美女精品成人在线视频| 中国成人黄色视屏| 欧美午夜a级限制福利片| 亚洲精品一二区| 亚洲特色特黄| 国产欧美日韩综合一区在线播放| 亚洲综合日韩中文字幕v在线| 亚洲视频专区在线| 国产精品入口麻豆原神| 香蕉亚洲视频| 欧美a级一区| 日韩一二在线观看| 国产精品青草久久久久福利99| 亚洲在线观看| 久久综合色8888| 亚洲精品一二区| 欧美色大人视频| 亚洲欧美中文另类| 猛男gaygay欧美视频| 亚洲人成精品久久久久| 欧美日韩一级黄| 西瓜成人精品人成网站| 欧美96在线丨欧| 亚洲网站视频福利| 国产一区二区三区免费观看| 美女网站在线免费欧美精品| 妖精视频成人观看www| 欧美中文字幕久久| 亚洲日本成人| 国产日产欧美精品| 免费视频一区二区三区在线观看| 一本色道婷婷久久欧美| 久久精品国产亚洲精品| 亚洲精品一区二区三区蜜桃久| 欧美日韩亚洲另类| 久久久久久**毛片大全| 日韩亚洲视频| 免费成人小视频| 午夜精品福利在线| 亚洲精品国精品久久99热一| 国产欧美日本一区二区三区| 欧美成人综合网站| 羞羞视频在线观看欧美| 亚洲精品久久久久中文字幕欢迎你 | 欧美精品激情在线观看| 欧美一区二区三区四区在线观看地址 | 香蕉久久a毛片| 日韩一级在线观看| 激情视频亚洲| 国产精品丝袜xxxxxxx| 欧美韩日一区二区| 久久精彩视频| 亚洲欧美日本在线| 日韩一级网站| 亚洲欧洲美洲综合色网| 巨胸喷奶水www久久久免费动漫| 亚洲天堂av在线免费| 亚洲国产精品精华液2区45| 国产麻豆91精品| 欧美日韩亚洲一区三区 | 久热精品在线视频| 午夜精品久久久久久久蜜桃app| 亚洲美女视频网| 91久久视频| 亚洲电影下载| 亚洲大片在线观看| 欧美成人免费网| 老司机精品久久| 久久躁狠狠躁夜夜爽| 久久精品首页| 久久免费国产精品| 久久久之久亚州精品露出| 欧美一区国产一区| 欧美在线影院| 久久精品一区中文字幕| 久久激情久久| 狂野欧美激情性xxxx| 久久久久一区| 欧美大片一区| 亚洲区国产区| 亚洲无毛电影| 性欧美长视频| 久久久亚洲影院你懂的| 久久久久久久久久久一区| 久久野战av| 欧美日韩岛国| 国产精品日韩欧美综合| 国产伦精品一区二区三区在线观看| 欧美日韩一区二区免费视频| 欧美日韩亚洲视频| 国产乱码精品一区二区三区五月婷 | 国产精品高潮视频| 国产精品成人在线观看| 国产精品亚洲精品| 国产精品一区二区久久久| 国产精品视频一| 国产精品久久久久久久免费软件| 国产伦精品一区二区三区免费| 国产一区二区高清视频| 亚洲国产精品一区二区第一页| 亚洲看片网站| 欧美亚洲一级片| 欧美电影资源| 亚洲手机成人高清视频| 久久国产精品99国产精| 欧美激情视频免费观看| 欧美体内she精视频在线观看| 国产午夜精品麻豆| 91久久夜色精品国产网站| 国产精品99久久久久久有的能看| 午夜视频在线观看一区| 久久精品免费电影| 蜜桃av一区二区| 亚洲乱码国产乱码精品精98午夜| 亚洲一级在线观看| 久久综合九色综合欧美就去吻| 免费在线观看精品| 国产精品v欧美精品∨日韩| 国产欧美日韩视频一区二区三区 | 欧美日韩xxxxx| 国产欧美日韩视频在线观看| 亚洲激情网站| 久久精品国产成人| 亚洲卡通欧美制服中文| 久久成人久久爱| 国产精品一页| 亚洲精品乱码久久久久久蜜桃91| 欧美在线一级视频| 99精品视频免费在线观看|