日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

談一下動(dòng)態(tài)庫的構(gòu)建

冬至子 ? 來源:計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室 ? 作者:好壞生長 ? 2023-01-18 11:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在前面介紹了靜態(tài)庫的構(gòu)建,這里談一下動(dòng)態(tài)庫的構(gòu)建,同樣以案例的方式描述,希望案例可起到模板的作用。

首先新建一個(gè)測試文件,test.c

#include 


int main()
{
  printf("hello world\\n");


  return 0;
}

它是可以編譯成功的

2.jpg

將可執(zhí)行文件a.out刪除

2.jpg

添加文件,如靜態(tài)庫中所示(這里省略掉了)

2.jpg

編譯運(yùn)行,同樣可以輸出

$ gcc test.c func.c
:~/Documents/clan/test2$ tree
.
├── a.out
├── func.c
├── func.h
└── test.c


0 directories, 4 files
:~/Documents/clan/test2$ ./a.out 
hello world
30

到此說明,所有文件是正常的,程序是正常的。

下面清除a.out文件,用動(dòng)態(tài)庫的方式實(shí)現(xiàn)。

: ~/Documents/clan/test2$ gcc test.c func.c

:~ /Documents/clan/test2$ tree

.

├── a.out

├── func.c

├── func.h

└── test.c

0 directories, 4 files

: ~/Documents/clan/test2$ ./a.out

hello world

30

:~ /Documents/clan/test2$ rm a.out

:~/Documents/clan/test2$ tree

.

├── func.c

├── func.h

└── test.c

0 directories, 3 files

: ~/Documents/clan/test2$ gcc -fPIC -shared -o libfunc.so func.c

:~ /Documents/clan/test2$ tree

.

├── func.c

├── func.h

├── libfunc.so

└── test.c

0 directories, 4 files

: ~/Documents/clan/test2$ gcc test.c libfunc.so

:~ /Documents/clan/test2$ tree

.

├── a.out

├── func.c

├── func.h

├── libfunc.so

└── test.c

0 directories, 5 files

:~/Documents/clan/test2$ ./a.out

./a.out: error while loading shared libraries: libfunc.so: cannot open shared o

2.jpg

`

很可惜,最后在鏈接動(dòng)態(tài)庫編譯的時(shí)候,失敗了,提示不能找到文件

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

在編譯程序時(shí),使用動(dòng)態(tài)鏈接庫和靜態(tài)庫是一致的,使用”-l庫名”的方式,在生成可執(zhí)行文件的時(shí)候會(huì)鏈接庫文件。

-L指定動(dòng)態(tài)鏈接庫的路徑,-ldtiger鏈接庫函數(shù)tiger。-ltiger是動(dòng)態(tài)庫的調(diào)用規(guī)則。Linux系統(tǒng)下的動(dòng)態(tài)庫命名方式是lib*.so,而在鏈接時(shí)表示位-l*,*是自己命名的庫名。

:~/Documents/clan/test2$ rm a.out 
:~/Documents/clan/test2$ gcc test.c -L./ -lfunc
:~/Documents/clan/test2$ tree
.
├── a.out
├── func.c
├── func.h
├── libfunc.so
└── test.c


0 directories, 5 files
:~/Documents/clan/test2$ ./a.out 
./a.out: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory

錯(cuò)誤是因?yàn)槌绦蜻\(yùn)行時(shí)沒有找到動(dòng)態(tài)鏈接庫造成的。程序編譯時(shí)鏈接動(dòng)態(tài)庫和運(yùn)行時(shí)使用動(dòng)態(tài)鏈接庫的概念是不同的,在運(yùn)行時(shí),程序鏈接的動(dòng)態(tài)鏈接庫需要在系統(tǒng)目錄下才行。為此,需要設(shè)置臨時(shí)環(huán)境變量

:~/Documents/clan/test2$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
:~/Documents/clan/test2$ gcc test.c -L./ -lfunc
:~/Documents/clan/test2$ ./a.out 
hello world
30

其中export LD_LIBRARY_PATH=$LD_LIBRARY_PATH**:**.表示動(dòng)態(tài)庫所在位置為當(dāng)前目錄,將當(dāng)前目錄添加到環(huán)境變量中,當(dāng)終端關(guān)閉,這個(gè)臨時(shí)變量就會(huì)消失。

2.jpg

上面的運(yùn)行結(jié)果顯示,可以正確輸出結(jié)果,也就是說,動(dòng)態(tài)庫是可以成功鏈接的。下面將上述案例稍微變復(fù)雜一點(diǎn),如果是多個(gè)層級目錄,又怎么處理,理解路徑是非常重要的。

:~/Documents/clan/test2$ tree
.
├── func
│ ├── func.c
│ └── func.h
└── test.c

1 directory, 3 files
:/Documents/clan/test2$ gcc -fPIC -shared -o func/libfunc.so func/func.c
:
/Documents/clan/test2 export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/func
:/Documents/clan/test2$ gcc test.c -L./func -lfunc
:
/Documents/clan/test2$ tree
.
├── a.out
├── func
│ ├── func.c
│ ├── func.h
│ └── libfunc.so
└── test.c

1 directory, 5 files
:~/Documents/clan/test2$ ./a.out
hello world
30

2.jpg

下面我們將用Makefile的形式來使用動(dòng)態(tài)庫,編輯Makefile文件

export LD_LIBRARY_PATH:=$LD_LIBRARY_PATH:/func

test : test.c func/libfunc.so

gcc -o test test.c -L./func -lfunc

func/libfunc.so : func/func.c func/func.h

gcc -fPIC -shared -o func/libfunc.so func/func.c

clean :

rm -f test func/libfunc.so

2.jpg

然后編譯執(zhí)行,同樣可以輸出正確結(jié)果

2.jpg

動(dòng)態(tài)庫的過程比靜態(tài)庫稍微復(fù)雜,但是在寫Makefile的時(shí)候,步驟基本相似,倒著寫gcc編譯過程即可。

審核編輯:劉清

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

    關(guān)注

    4

    文章

    617

    瀏覽量

    30176
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    20497
  • gcc編譯器
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    4035
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    Linux動(dòng)態(tài)鏈接的基本概念

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

    Linux動(dòng)態(tài)相關(guān)知識

    Linux 下有動(dòng)態(tài)和靜態(tài),動(dòng)態(tài)以.so為擴(kuò)展名,靜態(tài)以.a為擴(kuò)展名。二者都使用廣泛。本
    的頭像 發(fā)表于 11-07 09:23 ?1301次閱讀
    Linux<b class='flag-5'>下</b><b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫</b>相關(guān)知識

    大家一下自己用的是那種STM開發(fā)板

    大家一下自己用的是那種STM開發(fā)板
    發(fā)表于 08-15 23:56

    Linux動(dòng)態(tài)和靜態(tài)的制作及使用

    的,想象一下,如果多個(gè)程序鏈接了同個(gè),則每個(gè)生成的可執(zhí)行文件就都會(huì)有個(gè)的副本,必然會(huì)浪
    發(fā)表于 11-18 17:05

    Linux靜態(tài)動(dòng)態(tài)的制作與使用

    什么是靜態(tài)函數(shù)?動(dòng)態(tài)函數(shù)庫又是什么?linux靜態(tài)函數(shù)是怎樣創(chuàng)建并使用的?動(dòng)態(tài)函數(shù)庫是怎樣創(chuàng)建并使用的?
    發(fā)表于 04-26 06:45

    如何制作個(gè)Linux動(dòng)態(tài)

    以下主要介紹Linux 動(dòng)態(tài)、靜態(tài)、如何使用已有的動(dòng)態(tài), 以及如何制作
    發(fā)表于 11-04 06:58

    一下嵌入式系統(tǒng)的架構(gòu)

    主要對嵌入式系統(tǒng),單片機(jī)這塊一下嵌入式系統(tǒng)的架構(gòu)。該系列為硬件的選型第
    發(fā)表于 12-07 11:46

    一下PD3.0的電源規(guī)則

    電源規(guī)則大師匈今天一下PD3.0的電源規(guī)則,PD3.0標(biāo)準(zhǔn)標(biāo)定的規(guī)則。USB協(xié)議聲稱,為了世界和平世界環(huán)境,讓大家用上統(tǒng)標(biāo)準(zhǔn)的充電器,不用再為每個(gè)用電設(shè)備都配
    發(fā)表于 12-31 08:12

    什么是DLL (動(dòng)態(tài)連接)

    什么是DLL (動(dòng)態(tài)連接) DLL(動(dòng)態(tài)連接),既然是動(dòng)態(tài),那么就是有靜態(tài)連接,我想如果
    發(fā)表于 11-28 14:51 ?1.6w次閱讀

    Linux靜態(tài)動(dòng)態(tài)(共享)的制作與使用

    Linux靜態(tài)動(dòng)態(tài)(共享)的制作與使用Linux
    發(fā)表于 07-09 14:39 ?1500次閱讀

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

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

    Linux的靜態(tài)、動(dòng)態(tài)動(dòng)態(tài)加載

    的存在極大的提高了C/C++程序的復(fù)用性,但是對于初學(xué)者來說有些難以駕馭,本文從Linux的角度淺談Linux的靜態(tài)、動(dòng)態(tài)
    發(fā)表于 04-02 14:32 ?1225次閱讀

    種可在動(dòng)態(tài)環(huán)境構(gòu)建語義地圖的算法

    Localization And Mapping,SLAM)算法已經(jīng)可以達(dá)到較高的定位和制圖精度,但是在動(dòng)態(tài)環(huán)境如何通過剔除動(dòng)態(tài)物體來獲得較髙的定位精度,以及理解周圍場景中存在的物體及其位置信息等問題沒有得到很好的解決。在此
    發(fā)表于 05-07 14:56 ?4次下載

    嵌入式Linux動(dòng)態(tài)和靜態(tài)使用

    以下主要介紹Linux 動(dòng)態(tài)、靜態(tài)、如何使用已有的動(dòng)態(tài), 以及如何制作
    發(fā)表于 11-01 16:57 ?1次下載
    嵌入式Linux<b class='flag-5'>下</b><b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫</b>和靜態(tài)<b class='flag-5'>庫</b>使用

    Linux的靜態(tài)鏈接動(dòng)態(tài)鏈接的區(qū)別是什么?

    學(xué)習(xí)Linux動(dòng)態(tài)鏈接個(gè)繞不開的話題,我們今天就一起來看一下什么是動(dòng)態(tài)鏈接、
    的頭像 發(fā)表于 02-17 10:49 ?2542次閱讀
    Linux<b class='flag-5'>下</b>的靜態(tài)鏈接<b class='flag-5'>庫</b>和<b class='flag-5'>動(dòng)態(tài)</b>鏈接<b class='flag-5'>庫</b>的區(qū)別是什么?
    东乡县| 商南县| 鄄城县| 蓝田县| 惠州市| 东方市| 喀什市| 满洲里市| 阳朔县| 江西省| 诸城市| 西畴县| 神池县| 高台县| 大理市| 资阳市| 鹤山市| 弋阳县| 哈尔滨市| 涡阳县| 崇仁县| 东莞市| 长宁县| 白山市| 同心县| 泊头市| 和田县| 大城县| 藁城市| 嘉祥县| 田东县| 二连浩特市| 阳信县| 永年县| 新乐市| 海城市| 宝丰县| 远安县| 卢氏县| 山西省| 永川市|