衡阳派盒市场营销有限公司

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

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

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

靜態(tài)鏈接和靜態(tài)庫

學(xué)益得智能硬件 ? 來源:學(xué)益得智能硬件 ? 2023-02-08 14:17 ? 次閱讀
什么是靜態(tài)鏈接? C語言的編譯分為四個步驟,預(yù)處理、編譯、匯編、鏈接,其中鏈接又分為動態(tài)鏈接和靜態(tài)鏈接。
所謂靜態(tài)鏈接,就是把庫實(shí)現(xiàn)的代碼整合到最終的二進(jìn)制文件中,這樣的二進(jìn)制文件會比較大,因?yàn)槔锩婕劝俗约簩懙拇a,又包含了調(diào)用的庫的代碼。
但是好處就是程序在運(yùn)行的時(shí)候,不需要庫的支持。
我們就用mini2440這塊開發(fā)板來演示下。
61977146-a777-11ed-bfe3-dac502259ad0.png ?開發(fā)板上的文件系統(tǒng)是我自己制作的,簡單到只有一些基本的命令可以用,也沒有移植C庫。
#include 


int main()
{
    printf("helloworld
");


    return 0;
}

來個helloworld,先使用動態(tài)編譯。
[root@turbo ~]# arm-linux-gcc test.c -o test


[root@turbo ~]#
然后把程序傳輸?shù)介_發(fā)板上,但是程序根本跑不起來。
61e378a2-a777-11ed-bfe3-dac502259ad0.png ?因?yàn)閯討B(tài)鏈接程序在運(yùn)行的時(shí)候需要庫的支持,開發(fā)板上什么都沒有。
還是同樣的程序,改成靜態(tài)編譯。
[root@turbo ~]# arm-linux-gcc test.c -o test -static


[root@turbo ~]#

再次拷貝到開發(fā)板上運(yùn)行,這一次程序順利輸出了helloworld。
62019ea4-a777-11ed-bfe3-dac502259ad0.png ?所以有些場景下,靜態(tài)鏈接還是挺有用的。
說到靜態(tài)鏈接,就必須要提到靜態(tài)庫,因?yàn)殪o態(tài)鏈接鏈接的就是靜態(tài)庫。
如何制作靜態(tài)庫?
先來個hello.c,在主函數(shù)中調(diào)用print函數(shù)。
#include 


int main()
{
print();
    return 0;
}
在print.c中實(shí)現(xiàn)print函數(shù)。
#include 


void print()
{
    printf("this is test ...
");
}
第一步,對print.c做匯編操作。
gcc -c print.c
會自動生成print.o。然后把print.o做成靜態(tài)庫。
ar -crv libprint.a print.o
這里的libprint.a就是最終生成的靜態(tài)庫。
接下來就跟print.c沒有關(guān)系了,把它刪了也行。

編譯hello.c的時(shí)候,需要使用靜態(tài)編譯,并且鏈接靜態(tài)庫。
gcc hello.c -o hello -static -lprint -L .
參數(shù)有點(diǎn)多,static表示靜態(tài)編譯,小寫的l表示庫的名字,大寫的L表示庫的路徑。
最終生成的二進(jìn)制文件hello,即使放在一個沒有l(wèi)ibprint.a庫的環(huán)境下也能運(yùn)行。
靜態(tài)編譯在嵌入式開發(fā)中應(yīng)用很多,尤其是環(huán)境比較惡劣的情況下,有了靜態(tài)編譯,可以省去移植好多庫。


審核編輯 :李倩


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

    關(guān)注

    2

    文章

    796

    瀏覽量

    41759
  • 靜態(tài)鏈接
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    5939

原文標(biāo)題:靜態(tài)鏈接和靜態(tài)庫

文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    靜態(tài)鏈接和動態(tài)鏈接

    一、靜態(tài)鏈接靜態(tài)鏈接通過靜態(tài)進(jìn)行鏈接,生成的目標(biāo)程
    發(fā)表于 08-27 10:20

    動態(tài)和靜態(tài)的區(qū)別

    .so區(qū)分一個概念:是包含前綴lib以及后綴.a或者.so的一個整體名是去掉前綴和后綴剩下的部分四、動態(tài)和靜態(tài)的特點(diǎn)
    發(fā)表于 05-26 17:22

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

    可執(zhí)行代碼的二進(jìn)制格式,可以被載入內(nèi)存中執(zhí)行。根據(jù)鏈接時(shí)期的不同,又有:靜態(tài)和共享(動態(tài)
    發(fā)表于 11-18 17:05

    靜態(tài)的優(yōu)點(diǎn)及其靜態(tài)的使用解析

    一、靜態(tài)優(yōu)點(diǎn):運(yùn)行快,發(fā)布程序無需提供靜態(tài),因?yàn)橐呀?jīng)在app中,移植方便缺點(diǎn):更新慢 繁瑣1、靜態(tài)
    發(fā)表于 02-17 07:45

    課題三_基本共射極放大電路的組成和靜態(tài)分析(2學(xué)時(shí))

    基本共射極放大電路的組成和靜態(tài)分析基本共射極放大電路的組成和靜態(tài)分析
    發(fā)表于 11-13 17:00 ?0次下載

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

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

    關(guān)于堆棧和靜態(tài)以及動態(tài)內(nèi)存的理解

    全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量、未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 - 程序結(jié)
    的頭像 發(fā)表于 05-03 14:12 ?2710次閱讀

    GCC程序編譯的靜態(tài)鏈接和動態(tài)鏈接

    靜態(tài)鏈接使用靜態(tài)進(jìn)行鏈接,生成的程序包含程序運(yùn)行所需要的全部,可以直接運(yùn)行,不過
    的頭像 發(fā)表于 11-12 15:50 ?2723次閱讀
    GCC程序編譯的<b class='flag-5'>靜態(tài)</b><b class='flag-5'>鏈接</b>和動態(tài)<b class='flag-5'>鏈接</b>

    講解Linux虛擬機(jī)之使用動態(tài)和靜態(tài)

    了解 Linux 如何使用,包括靜態(tài)和動態(tài)的差別,有助于你解決依賴問題。
    發(fā)表于 05-06 17:05 ?2243次閱讀
    講解Linux虛擬機(jī)之使用動態(tài)<b class='flag-5'>庫</b><b class='flag-5'>和靜態(tài)</b><b class='flag-5'>庫</b>

    嵌入式Linux下動態(tài)和靜態(tài)使用

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

    Linux下動態(tài)和靜態(tài)制作與調(diào)用

    靜態(tài)是指在應(yīng)用中,有一些公共代碼需要反復(fù)使用,就把這些代碼編譯為“”文件;在鏈接步驟中,連接器將從文件取得所需的代碼,復(fù)制到生成的可執(zhí)
    的頭像 發(fā)表于 08-24 15:03 ?3824次閱讀
    Linux下動態(tài)<b class='flag-5'>庫</b><b class='flag-5'>和靜態(tài)</b><b class='flag-5'>庫</b>制作與調(diào)用

    動態(tài)和靜態(tài)的制作步驟

    是一種可執(zhí)行的二進(jìn)制文件,是編譯好的代碼。使用可以提高開發(fā)效率。在 Linux 下有靜態(tài)和動態(tài)
    的頭像 發(fā)表于 07-27 11:00 ?860次閱讀

    基本放大電路中靜態(tài)和靜態(tài)工作點(diǎn)一樣嗎?

    基本放大電路中靜態(tài)和靜態(tài)工作點(diǎn)一樣嗎?? 基本放大電路是指通常用于信號放大和增強(qiáng)的電路,它是電子工程中最基本的電路之一。在基本放大電路中,靜態(tài)和靜態(tài)工作點(diǎn)都是非常重要的概念,但它們
    的頭像 發(fā)表于 09-13 14:17 ?1933次閱讀

    動態(tài)電路和靜態(tài)電路的區(qū)別

    動態(tài)電路和靜態(tài)電路的區(qū)別 動態(tài)電路和靜態(tài)電路是電路的兩種基本類型,它們在電子設(shè)備中的作用與應(yīng)用不同。本文將詳細(xì)介紹動態(tài)電路和靜態(tài)電路的區(qū)別。 1. 概述 靜態(tài)電路和動態(tài)電路都是電子電路
    的頭像 發(fā)表于 09-17 10:47 ?5128次閱讀

    有源負(fù)載和靜態(tài)負(fù)載的區(qū)別是什么?

    有源負(fù)載和靜態(tài)負(fù)載的區(qū)別是什么?? 有源負(fù)載和靜態(tài)負(fù)載是電子領(lǐng)域中兩種常見的負(fù)載。在電路中,負(fù)載是指電路輸出能力的消耗者。在這篇文章中,我們將介紹有源負(fù)載和靜態(tài)負(fù)載之間的區(qū)別。 1. 有源負(fù)載
    的頭像 發(fā)表于 09-18 18:20 ?1927次閱讀
    奥斯卡娱乐城| 上市百家乐官网.评论| 百家乐网站出售| 大发888游戏平台403| 百家乐怎样赢| 百家乐官网代理每周返佣| 百家乐没有必胜| 赢钱的棋牌游戏| 金百家乐官网的玩法技巧和规则 | 龙陵县| 伟博百家乐现金网| 鸿运娱乐| 百家乐规则技法| 澳盈88开户,| 罗盘24山珠宝火坑| 网络棋牌游戏排行榜| 网上赌百家乐官网的玩法技巧和规则| 百家乐统计工具| 百家乐官网象棋赌博| 百家乐正网| 百家乐官网官方游戏| 百家乐大| 博彩百家乐官网心得| 欢乐谷百家乐的玩法技巧和规则| 澳门百家乐官网皇冠网| 百家乐专业术语| 娱乐城百家乐官网怎么样| 月亮城百家乐的玩法技巧和规则 | 百家乐官网代理商博彩e族| 免费百家乐的玩法技巧和规则| 百家乐外挂程式| 真人百家乐官网输钱惨了| 帝王娱乐城开户| 百家乐又称为什么| 玩百家乐怎么才能赢| 单机百家乐官网小游戏| 江西省| 凌龙棋牌官方下载| 赌片百家乐的玩法技巧和规则| 百家乐视频看不到| 百家乐官网网上真钱娱乐场开户注册|