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

如何在linux下制作靜態(tài)庫和動態(tài)庫

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

靜態(tài)庫(.a)

靜態(tài)庫顧名思義是靜態(tài)的,即程序編譯鏈接時,會把靜態(tài)庫的代碼鏈接到可執(zhí)行文件中。運行時不需要靜態(tài)庫(將靜態(tài)庫刪了也能運行)。相當(dāng)于靜態(tài)庫的代碼復(fù)制到了可執(zhí)行文件中。

制作靜態(tài)庫

分別有如下add.c add.h sub.c sub.h四個文件格式。
如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

  1. 首先把.c文件都編譯成.o文件。使用下面命令
//-c 編譯到二進制文件就停止
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
  1. 把.o打包的過程就是形成靜態(tài)庫的過程。使用下面命令:
# ar:archive file 歸檔文件   -rc:replace create
# libhello.a:lib是前綴名,必須加的;.a是靜態(tài)庫的后綴,必須加;hello是自己庫的名字
ar -rc libhello.a add.o sub.o

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

  1. 這樣我們的靜態(tài)庫就制作好啦。使用下面的命令可以查看靜態(tài)庫中的目錄列表:
# t:列出靜態(tài)庫中的文件
# v:verbose 詳細信息
ar -tv libhello.a

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器


創(chuàng)建一個makefile來使編譯程序簡化:
如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

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

首先將我們的庫函數(shù)放在一個文件夾里面:

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器
運行完如下圖所示:

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

使用:main函數(shù)如下:
如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

方法一:將該庫放到系統(tǒng)搜索的庫中。
頭文件gcc的默認搜索路徑是:/usr/include
庫文件的默認搜索路徑是:/lib64 or /usr/lib64

  1. 使用如下命令將自己的庫,復(fù)制到上面目錄中:
#復(fù)制頭文件
sudo cp ./hello/include/* /usr/include/ -rf

# 復(fù)制庫文件
sudo cp -rf ./hello/lib/* /lib64
  1. 使用該庫
    為什么我們使用c語言庫不用告訴他鏈接哪個庫呢?
    因為gcc是專門鏈接C語言的,他自己本身就設(shè)定好了,去哪個庫找。但是我們自己的庫,我們需要自己指定目錄。
# -l鏈接的意思  -lhello鏈接名字為hello的庫
# -static 選擇靜態(tài)鏈接的方式
gcc main.c -lhello -static    //默認生成a.out
gcc -o main main.c -lhello -static   //指定生成main可執(zhí)行文件

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

總結(jié):這種方法不推薦,因為涉及到更改系統(tǒng)目錄的內(nèi)容了。
我們再把那倆文件刪除:

sudo rm /usr/include/add.h /usr/include/sub.h
sudo rm /lib64/libhello.a

方法2:硬要使用。推薦
直接讓gcc找指定路徑的指定庫。
如下命令:

# -I:指定頭文件搜索路徑
# -L: 指定庫文件搜索路徑
# -lhello:指定使用哪個庫
gcc -o main main.c -I ./mklib/hello/include/ -L ./mklib/hello/lib/ -lhello

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

方法3:在系統(tǒng)的搜索路徑下,創(chuàng)建一個硬鏈接。也不推薦使用

動態(tài)庫(.so)

  • 程序在運行的時候才去鏈接動態(tài)庫的代碼,多個程序共享使用庫的代碼。
  • 一個動態(tài)庫鏈接的可執(zhí)行文件,僅僅包含用到的函數(shù)入口地址的一個表,而不是外部函數(shù)所在目標文件的整個機器碼。
  • 在可執(zhí)行文件開始運行之前,外部函數(shù)的機器碼由操作系統(tǒng)從磁盤上的該動態(tài)庫中復(fù)制到內(nèi)存中,這個過程稱為動態(tài)鏈接。
  • 動態(tài)庫可以在多個程序間共享,所以動態(tài)鏈接使得可執(zhí)行文件更小,節(jié)省了磁盤空間,OS采用虛擬內(nèi)存機制允許物理內(nèi)存中的一份動態(tài)數(shù)據(jù)庫被要用到該庫的所有進程共用,節(jié)省了內(nèi)存和磁盤空間。

制作動態(tài)庫

  1. 首先將.c文件變成與位置無關(guān)的二進制.o文件。
# -fPIC: 與二進制無關(guān)選項
gcc -fPIC -c add.c -o add_d.o
gcc -fPIC -c sub.c -o sub_d.o

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

  1. 將.o文件打包成動態(tài)庫
# -shared:動態(tài)庫選項
# libhello.so:lib是前綴,.so是后綴, hello是動態(tài)庫名字
gcc -shared add_d.o sub_d.o -o libhello.so

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

這樣我們的動態(tài)庫就制作成功啦。

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

首先寫一個makefile方便制作動態(tài)庫。

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

hello文件結(jié)構(gòu)如圖所示:
如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器

仍然用靜態(tài)庫的那個命令(不加static了,默認就是動態(tài)鏈接),如下:

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器
**解釋:**我們實際上用的方法是對的,也告訴gcc使用hello的庫了,并且默認也是動態(tài)鏈接。但是還是無法執(zhí)行。是因為,我們只是告訴gcc了,但是沒有告訴os,os在執(zhí)行此動態(tài)庫時,并不知道要去哪里把動態(tài)庫搬進內(nèi)存。因此我們要告訴,os去哪里找這個動態(tài)庫。

方法一:添加系統(tǒng)變量

  • OS使用LD_LIBRARY_PATH加載環(huán)境變量。
    將自己的庫的絕對路徑,添加到環(huán)境變量即可。
# 注意添加庫的路徑即可。
export LD_LIBRARY_PATH=$LD_LIBRARY:/home/xty/cplusplus/linux/20140110/mklib/hello/lib

如何在linux下制作靜態(tài)庫和動態(tài)庫,linux,linux,運維,服務(wù)器
總結(jié):不持久,重新登錄一次就又不能用了。因為環(huán)境變量會重新加載,我們弄得是臨時的環(huán)境變量。

方法二:修改配置文件

# 創(chuàng)建一個mylib.conf 配置文件,直接把庫的絕對路徑寫入即可。
sudo vim /etc/ld.so.conf.d/mylib.conf
# 更新緩存
sudo ldconfig

總結(jié):持久,推薦使用。

方法三:使用軟鏈接也可以
在/lib64/目錄里面,創(chuàng)建一個libhello.so軟鏈接,鏈接庫文件的地址。這個方法請讀者自行實現(xiàn),但是也不推薦,因為同樣更改了系統(tǒng)目錄內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-820660.html

到了這里,關(guān)于如何在linux下制作靜態(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īng)查實,立即刪除!

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

相關(guān)文章

  • Linux下動態(tài)庫和靜態(tài)庫編譯實踐

    之前寫過JNI的文章,在JNI實踐過程中,也涉及到對動態(tài)庫/靜態(tài)庫的一些編譯實踐,這里統(tǒng)一記錄一下。 注意 :-fPIC編譯選項可使GCC生成位置無關(guān)代碼,簡單來說生成的代碼中的函數(shù)與全局變量均為相對地址,通過GOT (Global offset table)來確定其位置,這種方式引入了一層額外的

    2024年01月17日
    瀏覽(21)
  • Linux中靜態(tài)庫和動態(tài)庫的使用

    Linux中靜態(tài)庫和動態(tài)庫的使用

    介紹: 庫是一個二進制文件,包含的代碼可被程序調(diào)用 標準C庫、數(shù)學(xué)庫、線程庫… 庫有源碼,可下載后編譯;也可以直接安裝二進制包 位置一般放在:/lib /usr/lib 庫的知識 庫是事先編譯好的,可以復(fù)用的代碼 在os上運行的程序基本上都要使用庫,使用庫可以提高開發(fā)效率

    2024年01月25日
    瀏覽(28)
  • 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—Web服務(wù)器(靜態(tài)、動態(tài)網(wǎng)站的搭建)

    Linux—Web服務(wù)器(靜態(tài)、動態(tài)網(wǎng)站的搭建)

    1.1www所用的協(xié)議 HTTP超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上最廣泛的一種網(wǎng)絡(luò)協(xié)議,所有的www文件都必須遵守這個標準 它是建立在TCP上一種的無狀態(tài)連接,整個基本的工作流程是客戶端發(fā)送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務(wù)端收到請求之后,服務(wù)端開始處理

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

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

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

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

    展開頭文件, 宏替換(變量宏、函數(shù)宏)、替換空格等 逐行檢查程序中出現(xiàn)的語法錯誤,簡單的邏輯錯誤 將 .s 匯編文件中所有的匯編指令翻譯成二進制機器碼(下面就是來了個截圖,二進制顯示了亂碼) 將 .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】—— 強大的命令行工具 P.13(文件系統(tǒng) | 軟硬鏈接 | 動態(tài)庫和靜態(tài)庫)

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

    在計算機科學(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)庫的認識

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

    這篇文章我們繼續(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)
  • 動態(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日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包