1. 程式人生 > >Linux C 靜態庫(.a) 與 動態庫(.so) 的詳解

Linux C 靜態庫(.a) 與 動態庫(.so) 的詳解

從本質上來說是一種可執行程式碼的二進位制格式,可以被載入記憶體中執行。庫分靜態庫動態庫兩種。

一、靜態庫和動態庫的區別

1、靜態函式庫

這類庫的名字一般是libxxx.a;利用靜態函式庫編譯成的檔案比較大--空間,因為整個函式庫的所有資料都會被整合進目的碼中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程式必須重新編譯。

2、動態函式庫

這類庫的名字一般是libxxx.so;相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目的碼中,你的程式執行到相關函式時才呼叫該函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小

。由於函式庫沒有被整合進你的程式,而是程式執行時動態的申請並呼叫--時間,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的升級/更新比較方便。

二、靜態庫

(一)簡單介紹

/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc \
  main.c src/* -I./include -L./lib -lmpi -o main

/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc 為交叉編譯工具鏈
\為換行,表示下一行與當行為同一行,‘\’後面不能有空格。
main.c 為主函式
src/* 為原始檔
-I 後面接標頭檔案
-L 後面接庫檔案路徑
-l 後面接庫檔名,全名為libmpi.a
.a 為靜態庫

(二)編寫及使用靜態庫

(1).設計庫原始碼 pr1.c、pr2.c 和 main.c

[[email protected] make_lib]$ cat pr1.c 
#include 
void print1(void) 
{ 
	printf("This is the first lib src!\n"); 
}

[[email protected] make_lib]$ cat pr2.c 
#include
void print2(void) 
{ 
	printf("This is the second src lib!\n"); 
}

[
[email protected]
make_lib]$ cat main.c int main(void) { print1(); print2(); return 0; }

(2).編譯pr1.c、pr2.c 檔案

[[email protected] make_lib]$ gcc -O -c pr1.c pr2.c 
[[email protected] make_lib]$ ls -l pr*.o 
-rw-rw-r--        1 bill          bill                    804    4 月  15 11:11 pr1.o 
-rw-rw-r--        1 bill          bill                    804    4 月  15 11:11 pr2.o 

(3).連結靜態庫

為了在編譯程式中正確找到庫檔案,靜態庫必須按照 lib[name].a 的規則命名,如下例中[name]=pr.

ar引數意義:

r:在庫中插入模組(替換)。當插入的模組名已經在庫中存在,則替換同名的模組。

s:寫入一個目標檔案索引到庫中,或者更新一個存在的目標檔案索引。

v:該選項用來顯示執行操作選項的附加資訊。

t:顯示庫的模組表清單。一般只顯示模組名。

[[email protected] make_lib]$ ar -rsv libpr.a pr1.o pr2.o 
a - pr1.o 
a - pr2.o 

[[email protected] make_lib]$ ar -t libpr.a 
pr1.o 
pr2.o 

(4).編譯連結選項

-L-l 引數放在後面。其中,-L 載入庫檔案路徑,-l 指明庫檔名字。

[[email protected] make_lib]$ gcc -o main main.c -L./ -lpr     // 生成main

(5).執行目標程式

[[email protected] make_lib]$ ./main 
This is the first lib src! 
This is the second src lib!

三、動態庫(隱式呼叫)

(1).設計庫程式碼

[[email protected] make_lib]$ cat pr1.c 
#include 
int p = 2; 
void print() { 
	printf("%p:%d\n", &p, p);
	printf("This is the first dll src!\n"); 
} 

(2).生成動態庫 xxx.so

[[email protected] make_lib]$ gcc -O -fpic -shared -o xxx.so pr1.c 
[[email protected] make_lib]$ ls -l *.so 
-rwxrwxr-x        1 bill          bill                  6592    4 月  15 15:19 xxx.so 

(3).動態庫的隱式呼叫

[[email protected] make_lib]$ cat main.c 
int main() 
{ 
	print(); 
	return 0; 
}

[[email protected] make_lib]$ gcc -o main main.c ./xxx.so 

[[email protected] make_lib]$ ./main 
0x97b5d4:2
this is the first lib src!

當動態庫的位置發生改變時,程式將無法正常執行,而動態庫取代靜態庫的好處之一則是通過更新動態庫而隨時升級庫的內容。 

附:

相關推薦

Linux C 靜態(.a) 動態(.so) 的

庫從本質上來說是一種可執行程式碼的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。 一、靜態庫和動態庫的區別 1、靜態函式庫 這類庫的名字一般是libxxx.a;利用靜態函式庫編譯成的檔案比較大--空間,因為整個函式庫的所有資料都會被整合進目的碼中,他的優點就顯而易見了,即編譯後的執行

Linux動態.a動態.so的生成區別、以及.so檔案的封裝使用

一、前言 如果有公司需要使用你們產品的一部分功能(通過程式碼呼叫這些功能),如果不想提供原始碼,那麼就可以通過封裝成庫檔案的形式提供給對方使用。本文主要介紹了生成動態庫與靜態庫檔案的過程、以及封裝和使用庫檔案的方法。 二、靜態庫.a與動態庫.so的生成與

《CMake實踐》筆記三:構建靜態(.a) 動態(.so) 及 如何使用外部共享和標頭檔案

五、靜態庫與動態庫構建 讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。 本節的任務: 1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,Hell

【轉】《CMake實踐》筆記三:構建靜態(.a) 動態(.so) 及 如何使用外部共享和標頭檔案

五、靜態庫與動態庫構建讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。本節的任務:1、建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,H

C/C++ 靜態連結(.a) 動態連結(.so)

平時我們寫程式都必須 include 很多標頭檔案,因為可以避免重複造輪子,軟體大廈可不是單靠一個人就能完成的。但是你是否知道引用的那些標頭檔案中的函式是怎麼被執行的呢?這就要牽扯到連結庫了! 庫有兩種,一種是 靜態連結庫,一種是 動態連結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的 includ

linux靜態.a動態.so檔案的生成和使用

1.靜態庫是一些目標檔案(字尾名為.o)的集合體而已。 2.靜態庫的字尾名是.a,對應於windows作業系統的字尾名為.lib的靜態庫。 3.可以使用ar命令來建立一個靜態庫檔案。 來看一個例項,根據書中的程式碼簡化的,先看一看可以編譯成庫檔案的原始檔中的程式碼: /* test.c */ i

c語言生成靜態.a動態.so

在windows下動態連結庫是以.dll字尾的檔案,二在Linux中,是以.so作字尾的檔案。 動態連結庫的好處就是節省記憶體空間。 1、Linux下建立動態連結庫 在使用GCC編譯程式時,只需加上-shared選項即可,這樣生成的執行程式即為動態連結庫。 例如有檔案:he

linux c 語言程式設計環境:動態靜態的製作

庫: 庫用於將相似函式打包在一個單元中。然後這些單元就可為其他開發人員所共享,並因此有了模組化程式設計這種說法 — 即,從模組中構建程式。Linux 支援兩種型別的庫,每一種庫都有各自的優缺點。靜態庫包

VS2017 Linux C++引用自定義的動態

++ -1 undefined mage 編譯運行 linux下 lin 套路 log 前一篇博客講了用系統庫libpthread.so的例子,只需要在項目屬性頁的[C++->命令行參數]和[鏈接器->命令行參數]中加上對應參數(比如-pthread)即可,然後

通過gcc建立靜態.a動態.so及其使用

gcc的常用選項 -v:檢視gcc版本 -c:只編譯,生成.o檔案,不進行連結 -g:包含除錯資訊,方便使用gdb除錯 -D:編譯時定義巨集 靜態庫的建立和使用 這裡使用命令ar,常用的選項是: -r:替換歸檔中已有的檔案或加入新檔案 -t:顯示歸檔檔

C++ 靜態聯編動態聯編

靜態聯編和動態聯編 1、聯編是指一個程式模組、程式碼之間互相關聯的過程。 2、靜態聯編(static binding),是程式的匹配、連線在編譯階段實現,也稱為早期匹配。 過載函式使用靜態

Oracle 數據啟動關閉 各種方式整理

歸檔模式 tro 需求 acl 提交 管理操作 edi 存在 datafile 概述 只有具備sysdba和sysoper系統特權的用戶才能啟動和關閉數據庫。 在啟動數據庫之前應該啟動監聽程序,否則就不能利用命令方式來管理數據庫,包括啟動和關閉數據庫。 雖然數據庫正常運行,

jvm原理(34)虛方法表動態分派機制

編寫程式碼: public class MyTest7 { public static void main(String[] args) { Animal animal = new Animal(); Animal

Linux靜態動態(.a、.so

ref:http://niefei.blog.ccidnet.com/blog/ccid/do_showone/tid_42855.html 1. 介紹   使用GNU的工具我們如何在Linux下建立自己的程式函式庫?一個“程式函式庫”簡單的說就是一個檔案包含了一些編譯好的程式碼和資料,這些編譯好的程式碼和資

深入探討Linux靜態動態(轉)

share 分享 命名 one .com 過程 程序 簡單介紹 mage 2.生成動態庫並使用 linux下編譯時通過 -shared 參數可以生成動態庫(.so)文件,如下 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。

Linux靜態動態

Linux 靜態庫 動態庫 靜態庫 先說說我們為什麽需要庫?當有些代碼我們大量會在程序中使用比如(scanf,printf等)這些函數我們需要在程序中頻繁使用,於是我們就把這些代碼編譯為庫文件,在需要使用時我們直接鏈接即可。 定義: ?程序在編譯時把靜態庫的代碼鏈接到可執行程序中,在代碼運行時不再

【領卓教育】Linux--靜態動態(共享) 區別、製作和使用

1.概念和區別      靜態庫 :(1)libxxx.a ,程式在編譯時,將庫編譯 進可執行程式中!                     &nbs

C++靜態動態

name mangling可以通過extern "C"解決。C++有個特定的關鍵字用來宣告採用C binding的函式:extern "C" 。用 extern "C"宣告的函式將使用函式名作符號名,就像C函式一樣。因此,只有非成員函式才能被宣告為extern "C",並且不能被過載。儘管限制多多,exter

Linux C 靜態動態

這次分享的宗旨是——讓大家學會建立與使用靜態庫、動態庫,知道靜態庫與動態庫的區別,知道使用的時候如何選擇。這裡不深入介紹靜態庫、動態庫的底層格式,記憶體佈局等,有興趣的同學,推薦一本書《程式設計師的自我

LINUX靜態動態符號衝突問題分析解決

1. 問題重現模型 為了重現問題並去掉無關干擾細節,我們將構建一個最簡單的可執行模組和依賴模組的關係鏈,程式依賴模型如下: 1.1 解釋 (1)有一個名為RTSP的第三方庫提供了公共介面RTSP_OPEN,RTSP可以編譯為靜態庫libRTSP_ST