一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux下的靜態(tài)鏈接庫和動態(tài)鏈接庫的區(qū)別是什么?

汽車電子技術(shù) ? 來源:嵌入式悅翔園 ? 作者: JamesBin ? 2023-02-17 10:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

學(xué)習(xí)Linux動態(tài)鏈接庫是一個(gè)繞不開的話題,我們今天就一起來看一下什么是動態(tài)鏈接庫、動態(tài)鏈接庫有什么好處、如何編譯出一個(gè)動態(tài)鏈接庫等幾個(gè)關(guān)于動態(tài)鏈接庫的幾個(gè)基本概念,廢話少說咱們直接開始!圖片

鏈接庫是什么?

當(dāng)使用 C 編程語言編寫一個(gè)應(yīng)用程序時(shí),我們不可能每個(gè)程序都從最底層開始編寫,這樣的話無論是學(xué)習(xí)還是工作,都會帶來很多的不便,于是庫就出現(xiàn)了。

我們可以把庫理解成前輩給我們寫好的可以直接拿來用的、成熟的代碼。本質(zhì)上來所庫是一種可執(zhí)行的二進(jìn)制文件,可以直接被操作系統(tǒng)載入內(nèi)存執(zhí)行,庫有兩種:靜態(tài)庫(.a、.lib)和動態(tài)庫(.so、.dll)。

你的代碼通常有多個(gè)庫文件,庫文件是計(jì)算機(jī)中給我們提供的一類函數(shù)、變量或類,我們無需知道他們是具體是怎么實(shí)現(xiàn)的,我們只需要關(guān)心它是怎么使用的,比如需要哪些參數(shù)、實(shí)現(xiàn)什么功能、返回值是什么樣的等等。

本質(zhì)上來說庫是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。

圖片

在這里插入圖片描述

靜態(tài)鏈接庫

靜態(tài)鏈接庫是指編譯鏈接時(shí),把庫文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件比較大,但在運(yùn)行時(shí)也就不再需要庫文件了。其后綴名一般為 .a 。

我們需要注意的是靜態(tài)庫是會隨著編譯一起被編譯到 .o 文件中的,即一旦程序編譯靜態(tài)庫與匯編生成的目標(biāo)文件一起鏈接為可執(zhí)行文件,那么靜態(tài)庫必定跟.o文件格式相似,只有這樣才能和目標(biāo)文件成功鏈接。

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

  • 靜態(tài)庫對函數(shù)庫的鏈接是放在編譯時(shí)期完成的。
  • 程序在運(yùn)行時(shí)與函數(shù)庫再無瓜葛,移植方便。
  • 浪費(fèi)空間和資源,因?yàn)樗邢嚓P(guān)的目標(biāo)文件與牽涉到的函數(shù)庫被鏈接合成一個(gè)可執(zhí)行文件。

動態(tài)鏈接庫

通過上面對靜態(tài)鏈接庫的介紹我們其實(shí)對庫應(yīng)該已經(jīng)有個(gè)概念了,既然有靜態(tài)鏈接庫那肯定就存在動態(tài)的鏈接庫,那什么是動態(tài)鏈接庫呢?我們一起來看一下!

我們知道靜態(tài)鏈接庫會占用很多不必要的資源,那我們就能想到動態(tài)鏈接庫的第一個(gè)特點(diǎn)肯定就是節(jié)省資源。

動態(tài)庫在程序編譯時(shí)并不會像靜態(tài)鏈接庫那樣被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入。不同的應(yīng)用程序如果調(diào)用相同的庫,那么在內(nèi)存里只需要有一份該共享庫的實(shí)例,規(guī)避了空間浪費(fèi)問題。動態(tài)庫在程序運(yùn)行是才被載入,也解決了靜態(tài)庫對程序的更新、部署和發(fā)布頁會帶來麻煩。用戶只需要更新動態(tài)庫即可,增量更新。

動態(tài)庫一般后綴名為 .so,gcc/g++在編譯時(shí)默認(rèn)使用動態(tài)庫。無論靜態(tài)庫,還是動態(tài)庫,都是由 .o 文件創(chuàng)建的。

動態(tài)庫的編譯

下面通過一個(gè)例子來介紹如何生成一個(gè)動態(tài)庫。建一個(gè)頭文件:dynamic.h三個(gè).cpp文件:dynamic_a.cppdynamic_b.cpp, dynamic_c.cpp我們將這幾個(gè)文件編譯成一個(gè)動態(tài)庫:libdynamic.so。

dynamic.h

#ifndef __DYNAMIC_H_
#define __DYNAMIC_H_
#include 
void dynamic_a();
void dynamic_b();
void dynamic_c();
#endif

dynamic_a.cpp

#include"dynamic.h"
void dynamic_a()
{
  cout<<"this is in dynamic_a "<

dynamic_b.cpp

#include"dynamic.h"
void dynamic_b()
{
  cout<<"this is in dynamic_b "<

dynamic_c.cpp

#include"dynamic.h"
void dynamic_c()
{
  cout<<"this is in dynamic_c "<

將這幾個(gè)文件編譯成動態(tài)庫libdynamic.so。編譯命令如下:

g++ dynamic_a.cpp dynamic_b.cpp dynamic_c.cpp -fPIC -shared -o libdynamic.so

參數(shù)說明:-shared:該選項(xiàng)指定生成動態(tài)連接庫-fPIC:表示編譯為位置獨(dú)立的代碼,不用此選項(xiàng)的話編譯后的代碼是位置相關(guān)的,所以動態(tài)載入時(shí)是通過代碼拷貝的方式來滿足不同進(jìn)程的需要,而不能達(dá)到真正代碼段共享的目的。

在上面的部分,我們已經(jīng)生成了一個(gè)libdynamic.so的動態(tài)鏈接庫,現(xiàn)在我們用一個(gè)程序來調(diào)用這個(gè)動態(tài)鏈接庫。

main.cpp

#include"dynamic.h"
int main()
{
  dynamic_c();
  dynamic_c();
  dynamic_c();
  return 0;
}

main.cpplibdynamic.so鏈接成一個(gè)可執(zhí)行文件main,命令如下:

g++ main.cpp -L. -ldynamic -o main

參數(shù)說明:-L:表示要連接的庫在當(dāng)前目錄中-ldynamic:編譯器查找動態(tài)連接庫時(shí)有隱含的命名規(guī)則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱。

測試可執(zhí)行程序main是否已經(jīng)鏈接的動態(tài)庫libdynamic.so,如果列出了libdynamic.so,那么就說明正常鏈接了??梢詧?zhí)行以下命令:

ldd main

如果運(yùn)行:

./main

出現(xiàn)錯(cuò)誤:

error while loading shared libraries: libdynamic.so: cannot open shared object file: No such file or directory

錯(cuò)誤原因:

ld提示找不到庫文件,而庫文件就在當(dāng)前目錄中。

鏈接器ld默認(rèn)的目錄是/lib/usr/lib,如果放在其他路徑也可以,需要讓ld知道庫文件在哪里。

解決方法1:

編輯/etc/ld.so.conf文件,在新的一行中加入庫文件所在目錄;比如筆者應(yīng)添加:/home/neu/code/Dynamic_library

sudo ldconfig

目的是用ldconfig加載,以更新/etc/ld.so.cache文件。

靜態(tài)庫的編譯

就以以上代碼演示,最好把生成的動態(tài)庫的東西全部刪掉。

編譯靜態(tài)庫

g++ -c dynamic_a.cpp dynamic_b.cpp dynamic_c.cpp

使用ar命令創(chuàng)建靜態(tài)庫文件(把目標(biāo)文檔歸檔)

ar cr libstatic.a dynamic_a.o dynamic_b.o dynamic_c.o  //cr標(biāo)志告訴ar將object文件封裝(archive)

參數(shù)說明:

d 從指定的靜態(tài)庫文件中刪除文件 
  m 把文件移動到指定的靜態(tài)庫文件中 
  p 把靜態(tài)庫文件中指定的文件輸出到標(biāo)準(zhǔn)輸出 
  q 快速地把文件追加到靜態(tài)庫文件中 
  r 把文件插入到靜態(tài)庫文件中 
  t 顯示靜態(tài)庫文件中文件的列表 
  x 從靜態(tài)庫文件中提取文件 
  a 把新的目標(biāo)文件(*.o)添加到靜態(tài)庫文件中現(xiàn)有文件之后

使用nm -s 命令來查看.a文件的內(nèi)容

nm -s libstatic.a

鏈接靜態(tài)庫

g++ main.cpp -lstatic -L. -static -o main//這里的-static選項(xiàng)是告訴編譯器,hello是靜態(tài)庫也可以用

//g++ main.cpp -lstatic -L.  -o main

執(zhí)行以下命令,因?yàn)楣P者還是用的動態(tài)庫的代碼,所以結(jié)果一樣

./main

動態(tài)鏈接庫的優(yōu)點(diǎn)

  • 節(jié)省資源;
  • 可以實(shí)現(xiàn)進(jìn)程間資源共享;
  • 更新、部署、發(fā)布簡單;
  • 可以控制動態(tài)庫的加載時(shí)間(何時(shí)加載);

關(guān)于第二點(diǎn)我們該如何理解呢?進(jìn)程間的資源共享就是說,某個(gè)程序的在運(yùn)行中要調(diào)用某個(gè)動態(tài)鏈接庫函數(shù)的時(shí)候,操作系統(tǒng)首先會查看所有正在運(yùn)行的程序,看在內(nèi)存里是否已有此庫函數(shù)的拷貝了。如果有,則讓其共享那一個(gè)拷貝,只有沒有才鏈接載入。

這樣的模式雖然會帶來一些 “動態(tài)鏈接” 額外的開銷,卻大大的節(jié)省了系統(tǒng)的內(nèi)存資源。C的標(biāo)準(zhǔn)庫就是動態(tài)鏈接庫,也就是說系統(tǒng)中所有運(yùn)行的程序共享著同一個(gè)C標(biāo)準(zhǔn)庫的代碼段。

結(jié)語

我們在編寫程序的時(shí)候,可以根據(jù)需求選擇什么時(shí)候或者什么情況下,鏈接載入哪個(gè)動態(tài)鏈接庫函數(shù)。你可以有一個(gè)相當(dāng)大的軟件,但每次運(yùn)行的時(shí)候,由于不同的操作需求,只有一小部分程序被載入內(nèi)存。

所有的函數(shù)本著 “有需求才調(diào)入” 的原則,于是大大節(jié)省了系統(tǒng)資源。比如現(xiàn)在的軟件通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態(tài)鏈接庫來實(shí)現(xiàn)。

在一次運(yùn)行當(dāng)中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以后再載入相應(yīng)的讀寫函數(shù),而不是一開始就將所有的讀寫函數(shù)都載入,然后才發(fā)覺在整個(gè)程序中根本沒有用到它們。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux動態(tài)鏈接庫的基本概念

    學(xué)習(xí)Linux動態(tài)鏈接庫是一個(gè)繞不開的話題,我們今天就一起來看一什么是動態(tài)鏈接庫
    發(fā)表于 09-27 14:31 ?1711次閱讀

    關(guān)于使用動態(tài)鏈接庫及圖像采集的問題

    我用的是方誠科技的工業(yè)相機(jī),里面提供了一些動態(tài)鏈接庫,包括了相機(jī)初始化,采集圖像,顏色處理等函數(shù),我以前都是用VB做的,買相機(jī)的時(shí)候他會提供VB的模塊,所以用VB比較方便?,F(xiàn)在我想用LABVIEW做
    發(fā)表于 05-26 18:05

    labview調(diào)用動態(tài)鏈接庫問題

    本帖最后由 ZHZJK 于 2014-7-15 11:07 編輯 本人使用動態(tài)鏈接庫一直沒成功過,這次準(zhǔn)備調(diào)用讀卡器的dll來讀卡用了其中 打開串口 和讀取卡號 兩函數(shù)總是有錯(cuò)希望大家?guī)兔纯?/div>
    發(fā)表于 07-15 11:01

    關(guān)于labview'的動態(tài)鏈接庫的問題

    最近使用labview調(diào)用動態(tài)鏈接庫,使用vs2017生成dll文件,然后調(diào)用,但是為什么輸入數(shù)組的情況輸出一直為0呢,我使用公式節(jié)點(diǎn)調(diào)用同樣的c語言,就沒問題?請教大佬們怎么解決?還有我想問一
    發(fā)表于 03-14 11:26

    基于動態(tài)鏈接庫技術(shù)的感應(yīng)器非線性特性校正

    提出一種基于動態(tài)鏈接庫技術(shù)的傳感器非線性特性校正新方法。將傳感器是數(shù)據(jù)采集程序與傳感器的非線性特性校正算法置于同一個(gè)動態(tài)鏈接庫中,這樣應(yīng)用程序從動態(tài)
    發(fā)表于 06-25 09:55 ?26次下載

    C++中動態(tài)鏈接庫的創(chuàng)建和調(diào)用

    動態(tài)連接的創(chuàng)建步驟: 一、創(chuàng)建Non-MFC DLL動態(tài)鏈接庫 1、打開File —> New —> Project選項(xiàng),選擇Win32 Dynamic-Link Library
    發(fā)表于 11-24 18:13 ?7次下載

    LINUX環(huán)境CLIPS動態(tài)鏈接庫的實(shí)現(xiàn)方法

    LINUX環(huán)境,為了簡便、快捷地制作出CLIPS動態(tài)鏈接庫,本文采用了CNU AUTOTOOLS把CLIPS嵌入式高級語言編譯成動態(tài)
    發(fā)表于 04-14 21:18 ?30次下載

    虛擬儀器中動態(tài)鏈接庫的應(yīng)用

    本文在闡述了動態(tài)鏈接庫技術(shù)和虛擬儀器中的 動態(tài)鏈接 機(jī)制的基礎(chǔ)上,詳述了基于DLL的USB接口虛擬儀器的設(shè)計(jì)的關(guān)鍵內(nèi)容。
    發(fā)表于 07-05 17:17 ?27次下載
    虛擬儀器中<b class='flag-5'>動態(tài)</b><b class='flag-5'>鏈接庫</b>的應(yīng)用

    VC++動態(tài)鏈接庫編程深入淺出

    靜態(tài)鏈接庫動態(tài)鏈接庫都是共享代碼的方式,如果采用靜態(tài)鏈接庫,則無論你愿不愿意,lib中的指令都
    發(fā)表于 10-21 17:03 ?0次下載
    VC++<b class='flag-5'>動態(tài)</b><b class='flag-5'>鏈接庫</b>編程深入淺出

    由MATLAB的.m文件生成動態(tài)鏈接庫的方法說明

    由MATLAB的.m文件生成動態(tài)鏈接庫的方法說明
    發(fā)表于 08-16 18:54 ?0次下載

    你知道linux 靜態(tài)和共享?

    靜態(tài)鏈接庫動態(tài)鏈接庫區(qū)別在于,主程序在運(yùn)行前,靜態(tài)鏈接庫
    發(fā)表于 04-26 16:46 ?3034次閱讀

    英創(chuàng)信息技術(shù)WinCE設(shè)備動態(tài)鏈接庫的制作與調(diào)用

    在使用英創(chuàng)ARM9系列主板做開發(fā)時(shí),用戶可能希望將自己一部分代碼封裝起來,隱藏代碼的實(shí)現(xiàn)過程,只提供接口供其他程序調(diào)用。使用動態(tài)鏈接庫(Dynamic Link Library)可以很好實(shí)現(xiàn)這個(gè)要求
    的頭像 發(fā)表于 01-15 14:33 ?1378次閱讀
    英創(chuàng)信息技術(shù)WinCE設(shè)備<b class='flag-5'>動態(tài)</b><b class='flag-5'>鏈接庫</b>的制作與調(diào)用

    單片機(jī)高階技能之動態(tài)鏈接庫技術(shù)實(shí)現(xiàn)

    單片機(jī)高階技能之動態(tài)鏈接庫技術(shù)實(shí)現(xiàn)
    發(fā)表于 11-17 12:21 ?13次下載
    單片機(jī)高階技能之<b class='flag-5'>動態(tài)</b><b class='flag-5'>鏈接庫</b>技術(shù)實(shí)現(xiàn)

    MELSEC數(shù)據(jù)鏈接庫參考手冊

    MELSEC數(shù)據(jù)鏈接庫參考手冊 產(chǎn)品規(guī)格書
    發(fā)表于 08-26 10:36 ?0次下載
    MELSEC數(shù)據(jù)<b class='flag-5'>鏈接庫</b>參考手冊

    深入探討Linux系統(tǒng)中的動態(tài)鏈接庫機(jī)制

    本文將深入探討Linux系統(tǒng)中的動態(tài)鏈接庫機(jī)制,這其中包括但不限于全局符號介入、延遲綁定以及地址無關(guān)代碼等內(nèi)容。 引言 在軟件開發(fā)過程中,動態(tài)
    的頭像 發(fā)表于 12-18 10:06 ?551次閱讀
    深入探討<b class='flag-5'>Linux</b>系統(tǒng)中的<b class='flag-5'>動態(tài)</b><b class='flag-5'>鏈接庫</b>機(jī)制