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

隨筆-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 老馬驛站 閱讀(245) 評論(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>
            日韩一级大片| aⅴ色国产欧美| 一区二区三区国产精品| 麻豆精品视频在线观看视频| 亚洲女爱视频在线| 国产日韩精品在线观看| 久久久五月天| 欧美福利一区| 亚洲欧美日韩网| 久久精品一区二区国产| 亚洲国产欧美一区二区三区同亚洲| 亚洲国产精品毛片| 欧美片第一页| 久久艳片www.17c.com| 欧美国产三级| 精品动漫3d一区二区三区免费版 | 亚洲国产高清在线| 亚洲国产三级| 国产色产综合色产在线视频 | 欧美资源在线观看| 欧美激情国产日韩| 99re6这里只有精品| 性久久久久久久久| 午夜一区二区三区在线观看| 午夜在线视频观看日韩17c| 国内成+人亚洲+欧美+综合在线| 亚洲第一久久影院| 国产精品亚洲综合色区韩国| 欧美高清在线视频| 亚洲欧美一区二区原创| 久久精品首页| 可以看av的网站久久看| 国产一区二区三区在线观看免费| 性久久久久久久久| 久久精品99| 一区视频在线| 欧美欧美天天天天操| 欧美va亚洲va日韩∨a综合色| 欧美阿v一级看视频| 亚洲婷婷免费| 久久精品国产视频| 亚洲国产精品t66y| 欧美视频日韩视频| 欧美一区二区精品在线| 美国成人直播| 亚洲一区二区三区免费视频| 国产精品黄视频| 日韩性生活视频| 欧美在线视频一区二区三区| 黄色成人av在线| 一本色道久久综合亚洲91| 猫咪成人在线观看| 日韩小视频在线观看专区| 久久成人免费| 亚洲欧美国产精品桃花| 亚洲国产成人精品久久| 国产午夜精品视频| 国产精品免费看片| 久久精品一区二区三区不卡牛牛 | 亚洲视频导航| 激情久久久久| 国产日韩精品视频一区二区三区| 女人色偷偷aa久久天堂| 欧美一区二区三区在线观看| 91久久国产综合久久蜜月精品 | 欧美激情女人20p| 午夜一区二区三视频在线观看 | 亚洲一区二区三区免费观看| 久久久久久久久久久成人| 亚洲中字在线| 亚洲欧美成人网| 亚洲一级黄色| 亚洲午夜精品网| 在线视频一区观看| 亚洲网站在线观看| 99精品99久久久久久宅男| 亚洲国产精品专区久久| 亚洲激情欧美| 在线视频国产日韩| 亚洲最新视频在线播放| 日韩亚洲欧美精品| 亚洲一区二区成人在线观看| 亚洲精品国产精品国自产观看| 亚洲激情二区| 一二美女精品欧洲| 欧美激情综合网| 欧美激情亚洲激情| 欧美日韩国产综合新一区| 欧美午夜精品久久久久久久| 国产欧美日韩伦理| 亚洲欧洲美洲综合色网| 在线综合亚洲欧美在线视频| 先锋a资源在线看亚洲| 老巨人导航500精品| 日韩午夜在线观看视频| 西西裸体人体做爰大胆久久久| 久热这里只精品99re8久| 欧美日本不卡| 亚洲国产欧美国产综合一区| 亚洲一区二区黄色| 亚洲国产人成综合网站| 亚洲欧美日韩精品| 欧美日韩精品久久久| 韩国av一区二区三区四区| 99国产一区| 亚洲风情亚aⅴ在线发布| 午夜免费在线观看精品视频| 欧美精品手机在线| 在线日韩中文| 久久野战av| 久久精品国产精品亚洲| 国产日韩欧美黄色| 欧美一区午夜精品| 亚洲欧美另类国产| 国产精品综合久久久| 亚洲一区制服诱惑| 99视频精品全部免费在线| 欧美理论视频| 亚洲视频在线二区| 亚洲视频精选在线| 国产精品色婷婷| 亚洲免费视频中文字幕| 亚洲伊人伊色伊影伊综合网| 国产精品黄色在线观看| 欧美在线视频一区| 久久久久久一区二区| 日韩亚洲不卡在线| 亚洲一区二区三区四区五区黄| 国产精品色网| 亚洲国产你懂的| 亚洲成在人线av| 欧美日本在线| 亚洲综合欧美| 久久伊人精品天天| 亚洲日本无吗高清不卡| 亚洲人成小说网站色在线| 国产精品海角社区在线观看| 久久高清一区| 欧美日韩精品一区| 免费黄网站欧美| 欧美日韩成人在线播放| 欧美一区二区三区免费观看视频| 久久精品欧美| 一区二区日韩伦理片| 久久久99国产精品免费| 99精品福利视频| 久久美女性网| 午夜精品亚洲| 欧美日韩国产一区二区三区| 久久国产一区| 国产日韩av在线播放| 一本色道久久综合| 亚洲最新视频在线| 你懂的视频欧美| 欧美成人免费小视频| 国产亚洲欧美另类一区二区三区| 99国产欧美久久久精品| 91久久夜色精品国产九色| 久久色在线播放| 久久一区精品| 一区二区三区在线观看视频| 久久久久久有精品国产| 老鸭窝毛片一区二区三区 | 欧美成人日韩| 欧美国产综合一区二区| 99在线精品观看| 欧美三级在线播放| 亚洲伦理在线免费看| 亚洲午夜伦理| 国产伦精品一区二区三区视频黑人 | 国产精品成人一区二区艾草| 亚洲精品久久久久久一区二区| 亚洲肉体裸体xxxx137| 欧美伦理a级免费电影| 一本色道久久88综合日韩精品| 香蕉久久一区二区不卡无毒影院 | 日韩一区二区精品| 亚洲欧美怡红院| 在线电影国产精品| 欧美国产高潮xxxx1819| 妖精成人www高清在线观看| 久久精品国产一区二区电影| 亚洲福利专区| 国产精品中文字幕欧美| 欧美gay视频激情| 亚洲欧美综合精品久久成人 | 久久久久欧美| 亚洲美女诱惑| 欧美黄色aaaa| 久久久午夜电影| 亚洲午夜在线观看| 日韩视频一区二区| 亚洲国产精品123| 国产一区二区日韩精品欧美精品| 欧美日韩高清在线| 欧美国产综合一区二区| 男人的天堂成人在线| 巨乳诱惑日韩免费av| 久久久久9999亚洲精品| 亚洲欧美在线一区|