加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、靜態(tài)鏈接
    • 二、動態(tài)鏈接
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

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

08/27 10:23
1128
閱讀需 3 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、靜態(tài)鏈接

靜態(tài)鏈接通過靜態(tài)庫進行鏈接,生成的目標程序中包含運行需要的所有庫,可以直接運行,不過就是文件比較大。靜態(tài)庫是匯編產(chǎn)生的.o文件的集合,一般以.a文件形式出現(xiàn)。gcc在使用靜態(tài)鏈接的時候需要加上-static參數(shù)。

二、動態(tài)鏈接

動態(tài)鏈接使用動態(tài)鏈接庫進行鏈接,生成的程序在執(zhí)行的時候需要加載所需要的動態(tài)庫才能運行,動態(tài)鏈接程序輕便,但必須依賴動態(tài)庫。Linux下的動態(tài)鏈接庫實際上是共享目標文件,一般是以.so文件形式存在。GCC默認是動態(tài)鏈接不需要加參數(shù)。

舉例子看一下動態(tài)鏈接庫的使用方法,創(chuàng)建三個C語言文件:mymath.c、mymath.h、test.c。

通過兩個變量相加的方式來舉例說明。

mymath.h添加內(nèi)容如下:

#ifndef __MYMATH_H_

#define __MYMATH_h_

#include<stdio.h>

extern int add(int a,int b);

#endif

mymath.c添加內(nèi)容如下:

#include "mymath.h"

int add(int a,int b)

{

return a+b;

}

最后來一個測試文件 test.c(在這里需要注意的一個小細節(jié),調(diào)用自己寫的.h文件時,必須使用雙引號,“xxxx.h”):

#include<stdio.h>

#include"mymath.h"

void main()

{

printf("2+3=%dn",add(2,3));

}

然后進行編譯,因為test引用了mymath.h,所以不能單獨編譯,gcc test.c mymath.c一起進行,否則就會報錯。(如下編譯正確)

接下來是生成動態(tài)鏈接庫的方法,gcc -shared xx -o xxx.so,當我們使用cat去進行查看的時候會發(fā)現(xiàn),so文件里全是亂碼,這就是使用動態(tài)鏈接庫的一個好處,可以防止核心算法的泄露。

現(xiàn)在就可以將mymath.c刪除掉了:

直接調(diào)用庫編譯發(fā)現(xiàn)程序不能運行。

下面將我們自己建立的庫移動到/usr/lib目錄下試試,然后發(fā)現(xiàn)代碼運行成功。

可以在Linux系統(tǒng)下自己嘗試下。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
AT25256B-SSHL-B 1 Microchip Technology Inc IC EEPROM 256KBIT 20MHZ 8SOIC

ECAD模型

下載ECAD模型
$1.25 查看
KSZ8863MLLI 1 Microchip Technology Inc DATACOM, LAN SWITCHING CIRCUIT, PQFP48
$5.09 查看
HCPL-0601-500E 1 Broadcom Limited Logic IC Output Optocoupler, 1-Element, 3750V Isolation, 10MBps, ROHS COMPLIANT, SOIC-8
$3.05 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜