www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 技術(shù)學(xué)院 > 技術(shù)前線
[導(dǎo)讀]在windows平臺(tái)和linux平臺(tái)下都大量存在著庫。庫本質(zhì)上是可執(zhí)行代碼的二進(jìn)制形式,能夠被操作系統(tǒng)加載到內(nèi)存中并執(zhí)行。由于Windows和Linux的基本差異,所以這兩個(gè)平臺(tái)的庫二進(jìn)制文件不相容??梢院?jiǎn)單地理解為將這些常用函數(shù)的目標(biāo)文件打包,并提供相應(yīng)的函數(shù)接口,以方便程序員使用。在使用函數(shù)時(shí),只需要包對(duì)應(yīng)的頭文件即可。動(dòng)態(tài)庫和靜態(tài)庫的使用方式不同,它們?cè)诓煌脚_(tái)下的后綴也有所不同。

Linux中的動(dòng)態(tài)庫和靜態(tài)庫基礎(chǔ)概念

靜態(tài)庫(Static Library):

靜態(tài)庫是一種在編譯時(shí)將代碼直接鏈接到可執(zhí)行文件中的庫。

它通常以.a(Archive)為擴(kuò)展名。

靜態(tài)庫在編譯時(shí)會(huì)被完整地復(fù)制到目標(biāo)程序中,因此生成的程序體積較大。

優(yōu)點(diǎn)是運(yùn)行時(shí)不需要額外的庫文件,便于部署和分發(fā)。

動(dòng)態(tài)庫(Dynamic Library):

動(dòng)態(tài)庫在編譯時(shí)并不會(huì)被直接鏈接到可執(zhí)行文件中,而是在程序運(yùn)行時(shí)才加載。

它通常以.so(Shared Object)為擴(kuò)展名。

動(dòng)態(tài)庫允許多個(gè)程序共享同一份庫文件,節(jié)省內(nèi)存空間。

優(yōu)點(diǎn)是更新和維護(hù)更為方便,只需替換庫文件即可影響所有使用該庫的程序。

動(dòng)態(tài)庫與靜態(tài)庫的主要區(qū)別體現(xiàn)在鏈接時(shí)機(jī)、文件形式、資源占用及維護(hù)方式等方面:

鏈接時(shí)機(jī)

靜態(tài)庫在編譯時(shí)直接整合到可執(zhí)行文件中,而動(dòng)態(tài)庫在運(yùn)行時(shí)加載。 ?

文件形式

靜態(tài)庫通常以.a(Linux)或.lib(Windows)為擴(kuò)展名,而動(dòng)態(tài)庫以.so(Linux)或.dll(Windows)為擴(kuò)展名。 ?

資源占用

靜態(tài)庫導(dǎo)致可執(zhí)行文件體積較大,但運(yùn)行時(shí)無需外部依賴;動(dòng)態(tài)庫文件較小且可被多個(gè)程序共享,但運(yùn)行時(shí)依賴外部文件。 ?

更新維護(hù)

靜態(tài)庫更新后需重新編譯所有依賴程序;動(dòng)態(tài)庫更新時(shí)只需替換庫文件,無需重新編譯主程序。 ?

運(yùn)行效率

靜態(tài)庫調(diào)用無額外開銷,但動(dòng)態(tài)庫首次調(diào)用時(shí)存在地址解析延遲。

相關(guān)優(yōu)勢(shì)

靜態(tài)庫的優(yōu)勢(shì):

獨(dú)立性:程序不依賴于外部庫,便于部署。

性能:由于代碼直接嵌入程序中,運(yùn)行時(shí)不需要額外的加載步驟,可能略微提高性能。

動(dòng)態(tài)庫的優(yōu)勢(shì):

共享性:多個(gè)程序可以共享同一份庫文件,節(jié)省磁盤空間和內(nèi)存。

靈活性:更新庫文件時(shí)不需要重新編譯所有依賴它的程序。

維護(hù)性:庫的維護(hù)和升級(jí)更為方便。

類型與應(yīng)用場(chǎng)景

靜態(tài)庫的應(yīng)用場(chǎng)景:

對(duì)安全性要求較高的應(yīng)用。

需要獨(dú)立部署且不經(jīng)常更新的程序。

動(dòng)態(tài)庫的應(yīng)用場(chǎng)景:

大型軟件系統(tǒng),需要頻繁更新和維護(hù)的庫。

多個(gè)應(yīng)用程序共享相同功能的場(chǎng)景。

示例代碼

創(chuàng)建靜態(tài)庫:

編寫源文件 mylib.c:

編寫源文件 mylib.c:

編譯成目標(biāo)文件:

編譯成目標(biāo)文件:

打包成靜態(tài)庫:

打包成靜態(tài)庫:

創(chuàng)建動(dòng)態(tài)庫:

編寫源文件 mylib.c:

編寫源文件 mylib.c:

編譯成共享對(duì)象:

編譯成共享對(duì)象:

使用靜態(tài)庫:

編寫主程序 main.c:

編寫主程序 main.c:

鏈接靜態(tài)庫編譯:

鏈接靜態(tài)庫編譯:

使用動(dòng)態(tài)庫:

編寫主程序 main.c:

編寫主程序 main.c:

鏈接動(dòng)態(tài)庫編譯:

鏈接動(dòng)態(tài)庫編譯:

運(yùn)行時(shí)需確保動(dòng)態(tài)庫路徑在 LD_LIBRARY_PATH 中:

運(yùn)行時(shí)需確保動(dòng)態(tài)庫路徑在 LD_LIBRARY_PATH 中:

遇到的問題及解決方法

問題:找不到動(dòng)態(tài)庫文件

原因:系統(tǒng)無法找到動(dòng)態(tài)庫文件,可能是因?yàn)閹煳募辉跇?biāo)準(zhǔn)路徑或未正確設(shè)置 LD_LIBRARY_PATH。

一、庫的基礎(chǔ)概念:

在windows平臺(tái)和linux平臺(tái)下都大量存在著庫。庫本質(zhì)上是可執(zhí)行代碼的二進(jìn)制形式,能夠被操作系統(tǒng)加載到內(nèi)存中并執(zhí)行。由于Windows和Linux的基本差異,所以這兩個(gè)平臺(tái)的庫二進(jìn)制文件不相容??梢院?jiǎn)單地理解為將這些常用函數(shù)的目標(biāo)文件打包,并提供相應(yīng)的函數(shù)接口,以方便程序員使用。在使用函數(shù)時(shí),只需要包對(duì)應(yīng)的頭文件即可。動(dòng)態(tài)庫和靜態(tài)庫的使用方式不同,它們?cè)诓煌脚_(tái)下的后綴也有所不同。

WINDOWS下:.dll 后綴為動(dòng)態(tài)庫,.lib 后綴為靜態(tài)庫;

LINUX下:.so后綴為動(dòng)態(tài)庫,.a后綴為靜態(tài)庫。

二、靜態(tài)庫與靜態(tài)鏈接

靜態(tài)庫:

簡(jiǎn)單地說,靜態(tài)庫就是由多個(gè)目標(biāo)文件打包壓縮而成的一個(gè)文件集合。比如在我們?nèi)粘>幊讨?,如果需要使用printf函數(shù),就需要包stdio.h的庫文件,使用strlen時(shí),又需要包string.h的庫文件,可是如果直接把對(duì)應(yīng)函數(shù)源碼編譯后形成的.o文件直接提供給我們,將會(huì)對(duì)我們的管理和使用上造成極大不便,于是可以使用“ar”壓縮程序?qū)⑦@些目標(biāo)文件壓縮在一起,形成libx.a靜態(tài)庫文件。

注:靜態(tài)庫命名格式:lib + "庫名稱”+ .a(后綴) 例:libadd.a就是一個(gè)叫add的靜態(tài)庫

靜態(tài)鏈接:

靜態(tài)庫的代碼在編譯鏈接時(shí)被鏈接到可執(zhí)行文件中,程序運(yùn)行時(shí)不再依賴靜態(tài)庫。只需將庫文件和程序編譯生成的文件鏈接,便可生成可執(zhí)行文件。

01庫的概述庫是代碼集合,為各種應(yīng)用提供了豐富的功能,如我們熟知的ceres庫、eigen庫和pcl庫等。這些功能模塊作為可執(zhí)行代碼的二進(jìn)制形式存在于系統(tǒng)中,并能被加載到內(nèi)存中直接使用。在Linux系統(tǒng)中,庫主要分為動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫兩大類。 動(dòng)態(tài)庫和靜態(tài)庫的文件后綴分別為.so和.a。

02庫的差異

△ 靜態(tài)庫的特點(diǎn)

靜態(tài)庫在編譯階段被鏈接到目標(biāo)代碼中,使得在程序運(yùn)行時(shí)無需該庫。這種特性提高了程序的移植性,但可能會(huì)導(dǎo)致體積的增加,因?yàn)樗邢嚓P(guān)文件都會(huì)被鏈接成一個(gè)較大的可執(zhí)行文件。

△ 動(dòng)態(tài)庫的特點(diǎn)

動(dòng)態(tài)庫在運(yùn)行時(shí)被加載,不會(huì)在編譯時(shí)被鏈接。這種方式減少了可執(zhí)行文件的體積,并且大多數(shù)常用的庫,如eigen和ceres,都采用動(dòng)態(tài)鏈接的方式。在程序運(yùn)行時(shí),這些庫作為依賴項(xiàng)被使用。若環(huán)境中缺乏相應(yīng)的動(dòng)態(tài)庫,則需要 安裝對(duì)應(yīng)的庫以解決編譯錯(cuò)誤。

03靜態(tài)庫的創(chuàng)建與使用△ 創(chuàng)建過程

在Linux環(huán)境下,創(chuàng)建靜態(tài)庫涉及幾個(gè)關(guān)鍵步驟。首先,通過編譯器將 源文件編譯為目標(biāo)文件,然后利用ar命令將這些目標(biāo)文件歸檔成一個(gè)靜態(tài)庫文件。創(chuàng)建靜態(tài)庫的過程如下:

```

編寫源文件(.c或.cpp文件)

使用gcc -c xxx.c或g++ -c xxx.cpp生成目標(biāo)文件(.o文件)

用ar命令將目標(biāo)文件歸檔,生成靜態(tài)庫

編寫一個(gè)頭文件,包含提供給調(diào)用者的函數(shù)、變量或類的聲明

```

△ 使用過程

在使用靜態(tài)庫時(shí), 需要在編譯時(shí)指定其路徑。同時(shí)也需注意靜態(tài)庫的版本兼容性問題,以確保程序能夠正確地調(diào)用其中的函數(shù)或變量。例如,在編寫調(diào)用靜態(tài)庫的程序時(shí),應(yīng)包含相應(yīng)的頭文件,并在編譯指令中明確指定靜態(tài)庫的信息。

04動(dòng)態(tài)庫的創(chuàng)建和使用△ 創(chuàng)建動(dòng)態(tài)庫

創(chuàng)建動(dòng)態(tài)庫需使用-fPIC參數(shù),編譯生成共享庫文件。具體過程如下:

```

g++ test.cpp -fPIC -shared -o libshowage.so

```

△ 使用動(dòng)態(tài)庫

在程序 運(yùn)行時(shí)要確保系統(tǒng)能找到共享對(duì)象文件。通常,將動(dòng)態(tài)庫放在標(biāo)準(zhǔn)的庫路徑下如/usr/local/lib,或者在運(yùn)行程序時(shí)明確指定庫的位置。通過設(shè)置庫路徑,可以解決動(dòng)態(tài)庫無法被識(shí)別的問題。

05多個(gè)文件生成一個(gè)動(dòng)態(tài)庫△ 多文件創(chuàng)建動(dòng)態(tài)庫

在將多個(gè)文件整合為一個(gè)動(dòng)態(tài)庫時(shí),應(yīng) 避免出現(xiàn)同名的聲明,否則編譯器將無法確定應(yīng)使用哪個(gè)源文件中的聲明,導(dǎo)致無法成功創(chuàng)建動(dòng)態(tài)庫。

△ 使用動(dòng)態(tài)庫注意事項(xiàng)

使用動(dòng)態(tài)庫時(shí)需要 注意函數(shù)調(diào)用和系統(tǒng)庫路徑,以確保程序在運(yùn)行時(shí)能夠正確地加載所需的共享庫。這包括檢查動(dòng)態(tài)庫的位置和確保相關(guān)的依存關(guān)系已安裝。

06安裝缺少的動(dòng)態(tài)庫在編譯過程中若遇到類似“xxxx.h文件未找到”的錯(cuò)誤,則很可能是缺少相應(yīng)的庫。 通過終端命令安裝缺少的庫如libxxx-dev可以有效解決此類編譯錯(cuò)誤。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉