什么是靜態(tài)鏈接?
C語(yǔ)言的編譯分為四個(gè)步驟,預(yù)處理、編譯、匯編、鏈接,其中鏈接又分為動(dòng)態(tài)鏈接和靜態(tài)鏈接。
所謂靜態(tài)鏈接,就是把庫(kù)實(shí)現(xiàn)的代碼整合到最終的二進(jìn)制文件中,這樣的二進(jìn)制文件會(huì)比較大,因?yàn)槔锩婕劝俗约簩懙拇a,又包含了調(diào)用的庫(kù)的代碼。
但是好處就是程序在運(yùn)行的時(shí)候,不需要庫(kù)的支持。
我們就用mini2440這塊開(kāi)發(fā)板來(lái)演示下。
?開(kāi)發(fā)板上的文件系統(tǒng)是我自己制作的,簡(jiǎn)單到只有一些基本的命令可以用,也沒(méi)有移植C庫(kù)。
?因?yàn)閯?dòng)態(tài)鏈接程序在運(yùn)行的時(shí)候需要庫(kù)的支持,開(kāi)發(fā)板上什么都沒(méi)有。
還是同樣的程序,改成靜態(tài)編譯。
?所以有些場(chǎng)景下,靜態(tài)鏈接還是挺有用的。
說(shuō)到靜態(tài)鏈接,就必須要提到靜態(tài)庫(kù),因?yàn)殪o態(tài)鏈接鏈接的就是靜態(tài)庫(kù)。
如何制作靜態(tài)庫(kù)?
先來(lái)個(gè)hello.c,在主函數(shù)中調(diào)用print函數(shù)。
接下來(lái)就跟print.c沒(méi)有關(guān)系了,把它刪了也行。
編譯hello.c的時(shí)候,需要使用靜態(tài)編譯,并且鏈接靜態(tài)庫(kù)。
最終生成的二進(jìn)制文件hello,即使放在一個(gè)沒(méi)有l(wèi)ibprint.a庫(kù)的環(huán)境下也能運(yùn)行。
靜態(tài)編譯在嵌入式開(kāi)發(fā)中應(yīng)用很多,尤其是環(huán)境比較惡劣的情況下,有了靜態(tài)編譯,可以省去移植好多庫(kù)。
所謂靜態(tài)鏈接,就是把庫(kù)實(shí)現(xiàn)的代碼整合到最終的二進(jìn)制文件中,這樣的二進(jìn)制文件會(huì)比較大,因?yàn)槔锩婕劝俗约簩懙拇a,又包含了調(diào)用的庫(kù)的代碼。
但是好處就是程序在運(yùn)行的時(shí)候,不需要庫(kù)的支持。
我們就用mini2440這塊開(kāi)發(fā)板來(lái)演示下。

int main()
{
printf("helloworld
");
return 0;
}
來(lái)個(gè)helloworld,先使用動(dòng)態(tài)編譯。
[
][ ]
然后把程序傳輸?shù)介_(kāi)發(fā)板上,但是程序根本跑不起來(lái)。
還是同樣的程序,改成靜態(tài)編譯。
[
][ ]
再次拷貝到開(kāi)發(fā)板上運(yùn)行,這一次程序順利輸出了helloworld。
說(shuō)到靜態(tài)鏈接,就必須要提到靜態(tài)庫(kù),因?yàn)殪o態(tài)鏈接鏈接的就是靜態(tài)庫(kù)。
如何制作靜態(tài)庫(kù)?
先來(lái)個(gè)hello.c,在主函數(shù)中調(diào)用print函數(shù)。
int main()
{
print();
return 0;
}
在print.c中實(shí)現(xiàn)print函數(shù)。
void print()
{
printf("this is test ...
");
}
第一步,對(duì)print.c做匯編操作。
gcc -c print.c
會(huì)自動(dòng)生成print.o。然后把print.o做成靜態(tài)庫(kù)。
ar -crv libprint.a print.o
這里的libprint.a就是最終生成的靜態(tài)庫(kù)。接下來(lái)就跟print.c沒(méi)有關(guān)系了,把它刪了也行。
編譯hello.c的時(shí)候,需要使用靜態(tài)編譯,并且鏈接靜態(tài)庫(kù)。
gcc hello.c -o hello -static -lprint -L .
參數(shù)有點(diǎn)多,static表示靜態(tài)編譯,小寫的l表示庫(kù)的名字,大寫的L表示庫(kù)的路徑。最終生成的二進(jìn)制文件hello,即使放在一個(gè)沒(méi)有l(wèi)ibprint.a庫(kù)的環(huán)境下也能運(yùn)行。
靜態(tài)編譯在嵌入式開(kāi)發(fā)中應(yīng)用很多,尤其是環(huán)境比較惡劣的情況下,有了靜態(tài)編譯,可以省去移植好多庫(kù)。
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
807瀏覽量
42317 -
靜態(tài)鏈接
+關(guān)注
關(guān)注
0文章
5瀏覽量
5996
原文標(biāo)題:靜態(tài)鏈接和靜態(tài)庫(kù)
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
靜態(tài)鏈接和動(dòng)態(tài)鏈接
一、靜態(tài)鏈接靜態(tài)鏈接通過(guò)靜態(tài)庫(kù)進(jìn)行鏈接,生成的目標(biāo)程
發(fā)表于 08-27 10:20
動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別
.so區(qū)分一個(gè)概念:庫(kù)是包含前綴lib以及后綴.a或者.so的一個(gè)整體庫(kù)名是去掉前綴和后綴剩下的部分四、動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的特點(diǎn)
發(fā)表于 05-26 17:22
Linux下動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的制作及使用
可執(zhí)行代碼的二進(jìn)制格式,可以被載入內(nèi)存中執(zhí)行。根據(jù)鏈接時(shí)期的不同,庫(kù)又有:靜態(tài)庫(kù)和共享庫(kù)(動(dòng)態(tài)庫(kù)
發(fā)表于 11-18 17:05
靜態(tài)庫(kù)的優(yōu)點(diǎn)及其靜態(tài)庫(kù)的使用解析
一、靜態(tài)庫(kù)優(yōu)點(diǎn):運(yùn)行快,發(fā)布程序無(wú)需提供靜態(tài)庫(kù),因?yàn)橐呀?jīng)在app中,移植方便缺點(diǎn):更新慢 繁瑣1、靜態(tài)庫(kù)
發(fā)表于 02-17 07:45
課題三_基本共射極放大電路的組成和靜態(tài)分析(2學(xué)時(shí))
基本共射極放大電路的組成和靜態(tài)分析基本共射極放大電路的組成和靜態(tài)分析
發(fā)表于 11-13 17:00
?0次下載
你知道linux 靜態(tài)庫(kù)和共享庫(kù)?
靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的區(qū)別在于,主程序在運(yùn)行前,靜態(tài)鏈接庫(kù)的鏈接固定寫入在程序中,而動(dòng)態(tài)
發(fā)表于 04-26 16:46
?3051次閱讀
關(guān)于堆棧和靜態(tài)以及動(dòng)態(tài)內(nèi)存的理解
全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量、未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 - 程序結(jié)
GCC程序編譯的靜態(tài)鏈接和動(dòng)態(tài)鏈接
靜態(tài)鏈接使用靜態(tài)庫(kù)進(jìn)行鏈接,生成的程序包含程序運(yùn)行所需要的全部庫(kù),可以直接運(yùn)行,不過(guò)

講解Linux虛擬機(jī)之使用動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
了解 Linux 如何使用庫(kù),包括靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的差別,有助于你解決依賴問(wèn)題。
發(fā)表于 05-06 17:05
?2466次閱讀

嵌入式Linux下動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)使用
以下主要介紹Linux 下動(dòng)態(tài)庫(kù)、靜態(tài)庫(kù)、如何使用已有的動(dòng)態(tài)庫(kù), 以及如何制作一個(gè)動(dòng)態(tài)庫(kù)。Linux下的動(dòng)態(tài)
發(fā)表于 11-01 16:57
?1次下載

Linux下動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)制作與調(diào)用
靜態(tài)庫(kù)是指在應(yīng)用中,有一些公共代碼需要反復(fù)使用,就把這些代碼編譯為“庫(kù)”文件;在鏈接步驟中,連接器將從庫(kù)文件取得所需的代碼,復(fù)制到生成的可執(zhí)

動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的制作步驟
庫(kù)是一種可執(zhí)行的二進(jìn)制文件,是編譯好的代碼。使用庫(kù)可以提高開(kāi)發(fā)效率。在 Linux 下有靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。
基本放大電路中靜態(tài)值和靜態(tài)工作點(diǎn)一樣嗎?
基本放大電路中靜態(tài)值和靜態(tài)工作點(diǎn)一樣嗎?? 基本放大電路是指通常用于信號(hào)放大和增強(qiáng)的電路,它是電子工程中最基本的電路之一。在基本放大電路中,靜態(tài)值和靜態(tài)工作點(diǎn)都是非常重要的概念,但它們
動(dòng)態(tài)電路和靜態(tài)電路的區(qū)別
動(dòng)態(tài)電路和靜態(tài)電路的區(qū)別 動(dòng)態(tài)電路和靜態(tài)電路是電路的兩種基本類型,它們?cè)陔娮釉O(shè)備中的作用與應(yīng)用不同。本文將詳細(xì)介紹動(dòng)態(tài)電路和靜態(tài)電路的區(qū)別。 1. 概述 靜態(tài)電路和動(dòng)態(tài)電路都是電子電路
有源負(fù)載和靜態(tài)負(fù)載的區(qū)別是什么?
有源負(fù)載和靜態(tài)負(fù)載的區(qū)別是什么?? 有源負(fù)載和靜態(tài)負(fù)載是電子領(lǐng)域中兩種常見(jiàn)的負(fù)載。在電路中,負(fù)載是指電路輸出能力的消耗者。在這篇文章中,我們將介紹有源負(fù)載和靜態(tài)負(fù)載之間的區(qū)別。 1. 有源負(fù)載
評(píng)論