什么是靜態鏈接?
C語言的編譯分為四個步驟,預處理、編譯、匯編、鏈接,其中鏈接又分為動態鏈接和靜態鏈接。
所謂靜態鏈接,就是把庫實現的代碼整合到最終的二進制文件中,這樣的二進制文件會比較大,因為里面既包含了自己寫的代碼,又包含了調用的庫的代碼。
但是好處就是程序在運行的時候,不需要庫的支持。
我們就用mini2440這塊開發板來演示下。
?開發板上的文件系統是我自己制作的,簡單到只有一些基本的命令可以用,也沒有移植C庫。
?因為動態鏈接程序在運行的時候需要庫的支持,開發板上什么都沒有。
還是同樣的程序,改成靜態編譯。
?所以有些場景下,靜態鏈接還是挺有用的。
說到靜態鏈接,就必須要提到靜態庫,因為靜態鏈接鏈接的就是靜態庫。
如何制作靜態庫?
先來個hello.c,在主函數中調用print函數。
接下來就跟print.c沒有關系了,把它刪了也行。
編譯hello.c的時候,需要使用靜態編譯,并且鏈接靜態庫。
最終生成的二進制文件hello,即使放在一個沒有libprint.a庫的環境下也能運行。
靜態編譯在嵌入式開發中應用很多,尤其是環境比較惡劣的情況下,有了靜態編譯,可以省去移植好多庫。
所謂靜態鏈接,就是把庫實現的代碼整合到最終的二進制文件中,這樣的二進制文件會比較大,因為里面既包含了自己寫的代碼,又包含了調用的庫的代碼。
但是好處就是程序在運行的時候,不需要庫的支持。
我們就用mini2440這塊開發板來演示下。

int main()
{
printf("helloworld
");
return 0;
}
來個helloworld,先使用動態編譯。
[
][ ]
然后把程序傳輸到開發板上,但是程序根本跑不起來。
還是同樣的程序,改成靜態編譯。
[
][ ]
再次拷貝到開發板上運行,這一次程序順利輸出了helloworld。
說到靜態鏈接,就必須要提到靜態庫,因為靜態鏈接鏈接的就是靜態庫。
如何制作靜態庫?
先來個hello.c,在主函數中調用print函數。
int main()
{
print();
return 0;
}
在print.c中實現print函數。
void print()
{
printf("this is test ...
");
}
第一步,對print.c做匯編操作。
gcc -c print.c
會自動生成print.o。然后把print.o做成靜態庫。
ar -crv libprint.a print.o
這里的libprint.a就是最終生成的靜態庫。接下來就跟print.c沒有關系了,把它刪了也行。
編譯hello.c的時候,需要使用靜態編譯,并且鏈接靜態庫。
gcc hello.c -o hello -static -lprint -L .
參數有點多,static表示靜態編譯,小寫的l表示庫的名字,大寫的L表示庫的路徑。最終生成的二進制文件hello,即使放在一個沒有libprint.a庫的環境下也能運行。
靜態編譯在嵌入式開發中應用很多,尤其是環境比較惡劣的情況下,有了靜態編譯,可以省去移植好多庫。
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
二進制
+關注
關注
2文章
803瀏覽量
42122 -
靜態鏈接
+關注
關注
0文章
5瀏覽量
5978
原文標題:靜態鏈接和靜態庫
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
關于堆棧和靜態以及動態內存的理解
全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量、未初始化的靜態變量在相鄰的另一塊區域。 - 程序結
基本放大電路中靜態值和靜態工作點一樣嗎?
基本放大電路中靜態值和靜態工作點一樣嗎?? 基本放大電路是指通常用于信號放大和增強的電路,它是電子工程中最基本的電路之一。在基本放大電路中,靜態值和靜態工作點都是非常重要的概念,但它們
動態電路和靜態電路的區別
動態電路和靜態電路的區別 動態電路和靜態電路是電路的兩種基本類型,它們在電子設備中的作用與應用不同。本文將詳細介紹動態電路和靜態電路的區別。 1. 概述 靜態電路和動態電路都是電子電路
有源負載和靜態負載的區別是什么?
有源負載和靜態負載的區別是什么?? 有源負載和靜態負載是電子領域中兩種常見的負載。在電路中,負載是指電路輸出能力的消耗者。在這篇文章中,我們將介紹有源負載和靜態負載之間的區別。 1. 有源負載
評論