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

【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

這篇具有很好參考價(jià)值的文章主要介紹了【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

軟鏈接

命令:ln -s 源文件名 目標(biāo)文件名
軟鏈接是獨(dú)立連接文件的,他有自己的inode number,有自己的inode屬性和內(nèi)容。
軟鏈接內(nèi)部存放的是自己所指向文件的路徑。
現(xiàn)實(shí)中,我們軟鏈接的應(yīng)用有,例如電腦桌面的快捷模式等。
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
inode number 不相同

硬鏈接

命令:ln 源文件目標(biāo)文件
硬鏈接,通過inode來重新鏈接一份文件,此文件的inode跟原文件的inode是一樣的,可以理解為原文件的淺拷貝,兩個(gè)文件內(nèi)容是共享的,不管增加還是刪除,這是因?yàn)樗麄兊膇node是相同的
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
inode相等
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

硬鏈接要注意

硬鏈接是不可以給目錄做硬鏈接的,這是因?yàn)楫?dāng)用戶進(jìn)行對(duì)目錄硬鏈接時(shí),容易造成環(huán)路問題,os無法識(shí)別那個(gè)是自己定義的硬鏈接。

了解目錄隱藏文件. ..
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

自定義實(shí)現(xiàn)一個(gè)靜態(tài)庫(kù)(.a)

  1. 系統(tǒng)已經(jīng)預(yù)裝了c/c++的頭文件和庫(kù)文件,頭文件提供方法說明,庫(kù)提供方法的實(shí)現(xiàn),頭和庫(kù)是有對(duì)應(yīng)關(guān)系的,是要組合在一起使用的。
  2. 頭文件是在預(yù)處理階段就引入的,鏈接本質(zhì)就是鏈接庫(kù)

方法一:頭文件和.o文件在一塊可直接應(yīng)用
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

形成靜態(tài)庫(kù)文件
命令:ar -rc lib庫(kù)名.a *.o
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

方法二:我們將庫(kù)和頭文件都帶入到另一個(gè)文件進(jìn)行重新編譯運(yùn)行
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
當(dāng)我們使用時(shí)發(fā)現(xiàn)不可以正常使用
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
這是因?yàn)槲覀円肓说谌降膸?kù),編譯器目前不認(rèn)可這個(gè)庫(kù),需要我們手動(dòng)

解決、使用方法

第三方庫(kù)的使用錯(cuò)誤解決方法:

  1. 需要指定所用的頭文件和庫(kù)文件
  2. 如果沒有安裝到對(duì)應(yīng)的編譯器路徑下,用戶必須指明對(duì)應(yīng)的選項(xiàng),告知編譯器,頭文件在哪里,庫(kù)文件在哪里,庫(kù)文件具體是誰。
  3. 將三方庫(kù)拷貝到編譯器路徑下時(shí),我們進(jìn)行編譯時(shí),也需要使用-l指定具體使用的庫(kù)

l:只要庫(kù)名即可(去掉lib以及版本號(hào))
L:鏈接庫(kù)所在的路徑
I:鏈接庫(kù)的頭文件所在路勁
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

方法三:頭文件放到include目錄下,庫(kù)文件放到lib目錄下,將兩個(gè)目錄打包交給別人
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

靜態(tài)庫(kù)的內(nèi)部加載過程

靜態(tài)庫(kù)不需要加載,靜態(tài)庫(kù)是將代碼直接拷貝到程序中,因此內(nèi)存中的代碼和數(shù)據(jù)可能會(huì)存在多分,造成空間浪費(fèi)。把靜態(tài)庫(kù)代碼拷貝到內(nèi)存中的代碼區(qū)。
當(dāng)我們將靜態(tài)庫(kù)加載過一次之后,在刪除靜態(tài)庫(kù)后還是可以正常跑的 【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

自定義實(shí)現(xiàn)一個(gè)動(dòng)態(tài)庫(kù)(.so)

形成動(dòng)態(tài)庫(kù)文件

  • shared: 表示生成共享庫(kù)格式
  • fPIC:產(chǎn)生位置無關(guān)碼
    動(dòng)態(tài)庫(kù)采用的是相對(duì)位置編址。只保存相對(duì)函數(shù)之間的偏量值(庫(kù)起始地址+函數(shù)之間偏移量)
    而靜態(tài)庫(kù)采用的為絕對(duì)地址,如果我們庫(kù)位置有所變動(dòng),他就需要重新拷貝
    【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

與靜態(tài)庫(kù)使用發(fā)放三方式相同,但是需要注意的方面不一樣

頭文件放到include目錄下,庫(kù)文件放到lib目錄下,將兩個(gè)目錄打包交給別人
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維

為什么靜態(tài)庫(kù)就可以找到而動(dòng)態(tài)庫(kù)就不可以呢?
這是因?yàn)殪o態(tài)庫(kù)的鏈接原則是將用戶使用的二進(jìn)制代碼直接拷貝到目標(biāo)可執(zhí)行程序中但是動(dòng)態(tài)庫(kù)不會(huì)。

如何解決os找不到動(dòng)態(tài)庫(kù)問題?

  1. 配置環(huán)境變LD_LIBRARY_PATH(臨時(shí)方案,當(dāng)系統(tǒng)重啟后需要重新配置)
    【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
    【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
  1. 軟連接方案
    【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
    去掉軟連接方法
    sudo unlink /lib64/libmy_math.so
  1. 配置文件方法
    ls /etc/ld.so.conf.d查看本地的路徑配置文件
    sudo touch /etc/ld.so.conf.d/myPath.conf添加創(chuàng)建本地路徑配置文件
    【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
    【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
    【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
    系統(tǒng)重新啟動(dòng)也是可以直接使用的,因?yàn)槲覀円呀?jīng)把環(huán)境配置好了
動(dòng)態(tài)庫(kù)加載過程

動(dòng)態(tài)庫(kù)通過fPIC形成位置無關(guān)碼,采用相對(duì)編址的方式,在程序鏈接時(shí)將對(duì)應(yīng)庫(kù)中的偏移量添加到程序中,庫(kù)函數(shù)在程序運(yùn)行時(shí)加載進(jìn)來,經(jīng)過頁表,把庫(kù)映射到虛擬地址空間后(共享區(qū)),庫(kù)就具有了起始地址。通過起始地址和偏移地址,就可以找到要調(diào)用的庫(kù)函數(shù)。
【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),Linux,linux,java,運(yùn)維
系統(tǒng)層面上會(huì)維護(hù)動(dòng)態(tài)庫(kù)的起始地址(雖然剛剛加載時(shí)不能確定起始地址,因?yàn)楣蚕韰^(qū)是由OS分配的,但是加載完畢就不會(huì)改變了),直接建立頁表與內(nèi)存的映射,就可以直接跳轉(zhuǎn)訪問了。所以動(dòng)態(tài)庫(kù)加載一次就可以被多個(gè)進(jìn)程共同使用。
動(dòng)態(tài)庫(kù)相對(duì)于靜態(tài)庫(kù)更節(jié)省內(nèi)存,靜態(tài)庫(kù)由多個(gè)程序使用相同的庫(kù)函數(shù),加載到內(nèi)存中就會(huì)導(dǎo)致內(nèi)存中有多份重復(fù)的庫(kù)函數(shù)代碼,而動(dòng)態(tài)庫(kù)則是多個(gè)程序共用一份動(dòng)態(tài)庫(kù),不會(huì)導(dǎo)致出現(xiàn)重復(fù)的庫(kù)函數(shù)代碼,就節(jié)省了內(nèi)存空間。

靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的特點(diǎn)

靜態(tài)庫(kù)的特點(diǎn):文章來源地址http://www.zghlxwxcb.cn/news/detail-672314.html

  • 靜態(tài)庫(kù)在可執(zhí)行程序鏈接時(shí)就加入到可執(zhí)行代碼中,在物理上成為可執(zhí)行程序的一部分;程序運(yùn)行時(shí)將不在需要該靜態(tài)庫(kù)。
  • 相對(duì)于動(dòng)態(tài)庫(kù)鏈接生成的程序,靜態(tài)還相當(dāng)于編譯器將代碼補(bǔ)充完整了,因此執(zhí)行程序會(huì)大一些,但是運(yùn)行起來相對(duì)快一些。
  • 靜態(tài)庫(kù)是犧牲了空間效率,換取了時(shí)間效率
    動(dòng)態(tài)庫(kù)特點(diǎn):
  • 動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)程序中,而是在程序運(yùn)行時(shí)才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)的存在。
    動(dòng)態(tài)庫(kù)只要在程序執(zhí)行時(shí),那些需要的函數(shù)代碼才被拷貝到內(nèi)存中。這樣就使可執(zhí)行文件比教小,節(jié)省磁盤空間。
  • 由于運(yùn)行時(shí)要去鏈接庫(kù)會(huì)花費(fèi)一定的時(shí)間,執(zhí)行速度可能會(huì)相對(duì)慢一些。
    動(dòng)態(tài)庫(kù)是犧牲了時(shí)間效率,換取了空間效率。

到了這里,關(guān)于【Linux】動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • linux下g++鏈接動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

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

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

    制作靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)

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

    2024年02月03日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包