国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

動態(tài)庫和靜態(tài)庫

這篇具有很好參考價值的文章主要介紹了動態(tài)庫和靜態(tài)庫。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 動態(tài)庫和靜態(tài)庫介紹

1. 靜態(tài)庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執(zhí)行文件中。程序運行的時候?qū)⒉辉傩枰o態(tài)庫。
2. 動態(tài)庫(.so):程序在運行的時候才去鏈接動態(tài)庫的代碼,多個程序共享使用庫的代碼。
3. 一個與動態(tài)庫鏈接的可執(zhí)行文件僅僅包含它用到的函數(shù)入口地址的一個表,而不是外部函數(shù)所在目標(biāo)文件的整個機(jī)器碼。
4. 在可執(zhí)行文件開始運行以前,外部函數(shù)的機(jī)器碼由操作系統(tǒng)從磁盤上的該動態(tài)庫中復(fù)制到內(nèi)存中,這個過程稱為動態(tài)鏈接。
5. 動態(tài)庫可以在多個程序間共享,所以動態(tài)鏈接使得可執(zhí)行文件更小,節(jié)省了磁盤空間。操作系統(tǒng)采用虛擬內(nèi)存機(jī)制允許物理內(nèi)存中的一份動態(tài)庫被要用到該庫的所有進(jìn)程共用,節(jié)省了內(nèi)存和磁盤空間
。

2. 創(chuàng)建一個靜態(tài)庫

首先,一個靜態(tài)庫里面不能有main函數(shù),原因是與我們自己的沖突。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
我們這里寫了兩個函數(shù)方法,一個是累加計算,一個是查看時間戳。

如果我們只把所有的.o文件放在一起,就可以鏈接使用嗎
我們可以來測試一下:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
只要把所有.o文件放在一起就可以鏈接使用。既然只需要.o文件就可以了,那么如果.o文件多的時候,我們打個包就可以了。

那么該如何打包呢?
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
ar是gnu歸檔工具,rc表示(replace and create)。這樣就完成了打包。

如果我們想查看靜態(tài)庫中的目錄列表,我們可以這樣:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
t:列出靜態(tài)庫中的文件。v:verbose 詳細(xì)信息。

我們也可以把這些過程寫入makefile里面:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫

我們知道:當(dāng)我們用庫的時候,我們需要頭文件和庫文件。那我們怎么在makefile里面寫呢?
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫

3. 創(chuàng)建一個動態(tài)庫

動態(tài)庫和靜態(tài)庫的思路大致類似:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
shared: 表示生成共享庫格式。fPIC:產(chǎn)生位置無關(guān)碼。庫名規(guī)則:libxxx.so。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
那么我們可以把這兩個庫放在makefile里一起生成:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
我們來運行一下:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
但是這樣會發(fā)生錯誤。原因是:動態(tài)庫生成的.o文件是和位置無關(guān)的,而靜態(tài)庫是和位置有關(guān)的。所以當(dāng)靜態(tài)庫gcc時就會發(fā)生沖突,我們可以改一下名字。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
運行一下:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫

4. 如何使用動靜態(tài)庫

4.1 使用靜態(tài)庫

看下面的例子:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
我們可以來編譯一下:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
你會發(fā)現(xiàn)找不到這個頭文件。原因是:頭文件的搜索有兩種路徑。一種是在當(dāng)前路徑下查找頭文件。一種是系統(tǒng)頭文件路徑下查找。
所以,我們可以把頭文件和庫文件拷貝到系統(tǒng)路徑下。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
然后我們在去運行:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
還是不行。原因是:我們以前是用的C/C++庫編譯器是認(rèn)識的,它會自動鏈接庫。而我們自己的庫編譯器不認(rèn)識,需要我們指定鏈接的第三方庫的名稱(gcc -l(指定鏈接的第三方庫的名稱))。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
庫的名稱是去掉lib和后綴。

但是我們不建議這樣做,因為這樣會污染我們的系統(tǒng)的庫文件和頭文件。

我們可以自己指定路徑:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
-I(大寫)的意思是:頭文件查找路徑
-L的意思是:庫文件搜索路徑
-l(小寫)的意思是:在-L指定的路徑下你要鏈接的是哪一個庫

4.2 使用動態(tài)庫

動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
第一種方法也是一樣就是把這些拷貝到系統(tǒng)路徑下。

我們來看第二種方法:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
為什么這里就不行了呢?原因是:這里的-I和-L的選項是作用于gcc的。這個gcc編譯器知道這個庫在哪里。但是當(dāng)我們可執(zhí)行程序運行的時候,它不知道庫在哪里。所以會報錯

解決辦法
第一種:通過導(dǎo)入環(huán)境變量的方式。當(dāng)程序運行時,會在環(huán)境變量中(LD_LIBRARY_PATH)查找自己需要的動態(tài)庫路徑。
具體步驟:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
這是我們動態(tài)庫的絕對路徑。我們要把這個路徑倒進(jìn)環(huán)境變量中。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
可以看到這個路徑已經(jīng)成功導(dǎo)入進(jìn)去了。此時,我們再去運行就是可以的。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
但是這里也會有一個問題:就是當(dāng)我們把shell關(guān)閉重新打開,這個環(huán)境變量就會消失。我們需要在系統(tǒng)配置文件來做。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
這些就是配置文件。當(dāng)系統(tǒng)讀我們自定義的動態(tài)庫時,除了會在lib64下去找,還會在這些配置文件里找。這里面的配置文件很簡單,就是我們的路徑。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
我們在這里先創(chuàng)建一個測試文件,在這里需要提升一下權(quán)限。然后在這個文件中把我們路徑寫進(jìn)去。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
但是此時你會發(fā)現(xiàn)我們的可執(zhí)行程序還是找不到動態(tài)庫:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
這里的原因是:配置文件還沒有生效。我們需要激活一下。也就是讓系統(tǒng)把文件加載到內(nèi)存里。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
這樣當(dāng)我們的shell關(guān)閉再打開也不會消失。

第二種:通過軟鏈接的方式。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
此時,我們再去編譯就會方便許多:
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
我們就不需要去指定庫文件的路徑了。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
此時我們找的就是軟鏈接。

那么為什么動態(tài)庫會出現(xiàn)這樣的問題呢?
這是進(jìn)程虛擬地址空間,棧是向下增長,堆是向上增長。但是棧和堆兩者之間是什么呢?
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
當(dāng)我們的可執(zhí)行程序加載到內(nèi)存運行時,有些代碼是需要跳轉(zhuǎn)到庫里運行。既然需要到庫里運行,那么我們就要將庫加載到內(nèi)存中。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
既然我們的程序要去執(zhí)行庫的代碼,系統(tǒng)就會將庫通過頁表映射到堆棧之間。
動態(tài)庫和靜態(tài)庫,Linux,linux,動靜態(tài)庫
這個區(qū)域就叫做:共享區(qū)。我們的進(jìn)程是先執(zhí)行自己的代碼,然后遇到庫的代碼就會去共享區(qū)里,運行完成后再回到代碼區(qū)。

所以,動態(tài)庫會出現(xiàn)這個情況。原因是:進(jìn)程運行時,如果要動態(tài)加載它所需要的庫。前提是需要先找到這個庫在哪里?而我們進(jìn)程在運行時它不知道。文章來源地址http://www.zghlxwxcb.cn/news/detail-703413.html

到了這里,關(guān)于動態(tài)庫和靜態(tài)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • linux下g++鏈接動態(tài)庫和靜態(tài)庫

    頭文件的作用: include的作用就是復(fù)制內(nèi)容到當(dāng)前文件 井號開頭的就是預(yù)處理指令,由預(yù)處理器處理,預(yù)處理階段不關(guān)心代碼,只處理預(yù)處理指令。 頭文件主要 一是為了解決代碼都寫在一個文件太大了,二是把變量,結(jié)構(gòu)體,函數(shù)聲明這些固定的放在一起 函數(shù)只要聲明了,

    2024年02月09日
    瀏覽(21)
  • linux并發(fā)服務(wù)器 —— 動態(tài)庫和靜態(tài)庫實戰(zhàn)(一)

    linux并發(fā)服務(wù)器 —— 動態(tài)庫和靜態(tài)庫實戰(zhàn)(一)

    -E 預(yù)處理指定源文件 -S 編譯指定源文件 -c 匯編指定源文件 -o 生成可執(zhí)行文件 -I directory 指定Include包含文件的搜索目錄 -g 編譯的時候生成調(diào)試信息 -D 在程序編譯時指定一個宏 -w 不生成任何的警告信息 -Wall 生成所有警告 -On n:0~3;表示編譯器的優(yōu)化選項級別 O0 - 不優(yōu)化;O1 -

    2024年02月11日
    瀏覽(20)
  • Linux操作命令&靜態(tài)庫和動態(tài)庫區(qū)別&大小端&孤兒僵尸進(jìn)程

    cd:切換當(dāng)前目錄 ls:查看當(dāng)前文件與目錄 grep:通常與管道符命令一起使用,用于對一些命令的輸出進(jìn)行篩選和加工 cp:復(fù)制文件或文件夾 mv:移動文件或文件夾 rm:刪除文件或文件夾 ps:查看進(jìn)程情況 kill:向進(jìn)程發(fā)送信號 tar:對文件進(jìn)行打包 cat:查看文件內(nèi)容 top:查看

    2024年02月16日
    瀏覽(21)
  • Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調(diào)試

    Linux下gcc編譯,動態(tài)庫和靜態(tài)庫,makefile,gdb調(diào)試

    展開頭文件, 宏替換(變量宏、函數(shù)宏)、替換空格等 逐行檢查程序中出現(xiàn)的語法錯誤,簡單的邏輯錯誤 將 .s 匯編文件中所有的匯編指令翻譯成二進(jìn)制機(jī)器碼(下面就是來了個截圖,二進(jìn)制顯示了亂碼) 將 .o 的目標(biāo)文件,鏈接庫文件、數(shù)據(jù)段合并,地址回填(把匯編里相

    2024年02月08日
    瀏覽(52)
  • 詳解Linux下靜態(tài)庫/動態(tài)庫的生成和使用(含代碼示例和操作流程)&&動態(tài)庫和靜態(tài)庫的區(qū)別

    詳解Linux下靜態(tài)庫/動態(tài)庫的生成和使用(含代碼示例和操作流程)&&動態(tài)庫和靜態(tài)庫的區(qū)別

    關(guān)于gcc的使用方法可以參考下方鏈接博客: Linux下詳解gcc編譯過程(含代碼示例) gcc使用教程 庫是一種組件技術(shù)。 庫里封裝了數(shù)據(jù)和函數(shù),提供給用戶程序調(diào)用。 庫只執(zhí)行到第三階段編譯,沒有鏈接。 庫的使用可以使程序模塊化,提高程序的編譯速度,實現(xiàn)代碼復(fù)用。

    2024年02月15日
    瀏覽(33)
  • 【探索Linux】—— 強(qiáng)大的命令行工具 P.13(文件系統(tǒng) | 軟硬鏈接 | 動態(tài)庫和靜態(tài)庫)

    【探索Linux】—— 強(qiáng)大的命令行工具 P.13(文件系統(tǒng) | 軟硬鏈接 | 動態(tài)庫和靜態(tài)庫)

    在計算機(jī)科學(xué)領(lǐng)域中,Linux 系統(tǒng)一直以來都是備受推崇的操作系統(tǒng)之一。其中,文件系統(tǒng)、軟硬鏈接、動態(tài)庫和靜態(tài)庫是 Linux 系統(tǒng)中非常重要的概念,在實際應(yīng)用中扮演著不可或缺的角色。 在上一篇文章中,我們了解了 Linux 系統(tǒng)中文件描述符、重定向以及基礎(chǔ) IO 操作的相關(guān)

    2024年02月04日
    瀏覽(21)
  • 【Linux系統(tǒng)編程】Linux下的編譯器——gcc/g++的使用 及 動態(tài)庫和靜態(tài)庫的認(rèn)識

    【Linux系統(tǒng)編程】Linux下的編譯器——gcc/g++的使用 及 動態(tài)庫和靜態(tài)庫的認(rèn)識

    這篇文章我們繼續(xù)學(xué)習(xí)Linux中的開發(fā)工具,今天要學(xué)的是: Linux下的編譯器——gcc/g++ 我們先來簡單了解一下它們的概念: gcc (GNU Compiler Collection) 和 g++ 是 Linux 系統(tǒng)上最常用的編譯器。它們是 GNU 組織開發(fā)的一套開源編譯器工具集。 gcc: gcc 是 GNU 編譯器集合中的 C 語言編譯器。

    2024年02月16日
    瀏覽(23)
  • 【Linux】靜態(tài)庫和共享庫一分鐘快速上手

    程序庫,對于程序原來說是非常重要的。但不少人對其不太了解,接下來一起學(xué)習(xí)其中的奧秘吧! 簡單來說,程序庫可以分為靜態(tài)庫和共享庫。它們包含了數(shù)據(jù)和執(zhí)行代碼的文件。其不能單獨執(zhí)行,可以作為其他執(zhí)行程序的一部分來完成某些功能。庫的存在,可以使得程序模

    2024年02月08日
    瀏覽(28)
  • 動態(tài)庫和靜態(tài)庫

    動態(tài)庫和靜態(tài)庫

    1. 靜態(tài)庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執(zhí)行文件中。程序運行的時候?qū)⒉辉傩枰o態(tài)庫。 2. 動態(tài)庫(.so):程序在運行的時候才去鏈接動態(tài)庫的代碼,多個程序共享使用庫的代碼。 3. 一個與動態(tài)庫鏈接的可執(zhí)行文件僅僅包含它用到的函數(shù)入口地址的一個

    2024年02月09日
    瀏覽(18)
  • 制作靜態(tài)庫和動態(tài)庫

    制作靜態(tài)庫和動態(tài)庫

    目錄 制作靜態(tài)庫 ar命令 使用makefile制作靜態(tài)庫 如何發(fā)布自己的靜態(tài)庫給別人呢? 如何使用靜態(tài)庫呢? 方法一 方法二 制作動態(tài)庫 使用動態(tài)庫遇到的問題 上面的問題如何解決呢?(如何使用動態(tài)庫) 1.方法一 2.方法二 3.方法三 4.方法四 搜索優(yōu)先級 Linux默認(rèn)頭文件的搜索順序

    2024年02月03日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包