1. 程式人生 > >問題集合 ---- linux 靜態庫和動態庫建立、檢查、使用建議

問題集合 ---- linux 靜態庫和動態庫建立、檢查、使用建議

===================================================================

linux靜態庫和動態庫分析

本文轉自 http://www.linuxeden.com/html/develop/20100326/94297.html

1.什麼是庫

  在windows平臺和linux平臺下都大量存在著庫。

  本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。

  由於windows和linux的本質不同,因此二者庫的二進位制是不相容的。

  本文僅限於介紹linux下的庫。

2.庫的種類

  linux下的庫有兩種:靜態

庫和共享庫(動態庫)。

  二者的不同點在於程式碼被載入的時刻不同。

  靜態庫的程式碼在編譯過程中已經被載入可執行程式,因此體積較大。

  共享庫的程式碼是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此程式碼體積較小。

3.庫存在的意義

  庫是別人寫好的現有的,成熟的,可以複用的程式碼,你可以使用但要記得遵守許可協議

  現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的程式碼都從零開始,因此庫的存在意義非同尋常。

  共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有一份該共享庫的例項。

4.庫檔案是如何產生的在linux下

  靜態庫的字尾是.a,它的產生分兩步

  Step 1.由原始檔編譯生成一堆.o,每個.o裡都包含這個編譯單元的符號表

  Step 2.ar命令將很多.o轉換成.a,成文靜態

  動態庫的字尾是.so,它由gcc加特定引數編譯產生。

  例如:

檢視文字列印
  1. $ gcc -fPIC -c *.c   
檢視文字列印
  1. $ gcc -fPIC -c *.c   
檢視文字列印
  1. $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.  
檢視文字列印
  1. $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.  

5.庫檔案是如何命名的,有沒有什麼規範

  在linux下,庫檔案一般放在/usr/lib /lib下,

  靜態庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱

  動態庫的名字一般為libxxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號, minor是副版本號

6.如何知道一個可執行程式依賴哪些庫

  ldd命令可以檢視一個可執行程式依賴的共享庫,

  例如# ldd /bin/lnlibc.so.6

檢視文字列印
  1. => /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
  2. => /lib/ld- linux.so.2 (0×40000000)  
檢視文字列印
  1. => /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
  2. => /lib/ld- linux.so.2 (0×40000000)  

  可以看到ln命令依賴於libc庫和ld-linux庫

7.可執行程式在執行的時候如何定位共享庫檔案

  當系統載入可執行程式碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑

  此時就需要系統動態載入器(dynamic linker/loader)

  對於elf格式的可執行程式,是由ld-linux.so*來完成的,它先後搜尋elf檔案的

                —DT_RPATH

                —環境變數LD_LIBRARY_PATH

                —/etc/ld.so.cache檔案列表

                —/lib/,/usr/lib目錄找到庫檔案後將其載入記憶體

8.在新安裝一個庫之後如何讓系統能夠找到他

  如果安裝在/lib或者/usr/lib下,那麼ld預設能夠找到,無需其他操作。

  如果安裝在其他目錄,需要將其新增到/etc/ld.so.cache檔案中,步驟如下

  1.編輯/etc/ld.so.conf檔案,加入庫檔案所在目錄的路徑

  2.執行ldconfig,該命令會重建/etc/ld.so.cache檔案

==============================================================================================

gcc生成靜態庫和動態

本文轉自 http://hi.baidu.com/gaomanyi/blog/item/1be9a11bdca98c1f8718bf9e.html

  我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。

       靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。

      本文主要通過舉例來說明 在Linux中如何建立靜態庫和動態庫,以及使用它們。在建立函式庫前,我們先來準備舉例用的源程式,並將函式庫的源程式編譯成.o檔案。

  第1步:編輯得到舉例的程式--hello.h、hello.c和main.c;

  hello.h(見程式1)為該函式庫的標頭檔案。

  hello.c(見程式2)是函式庫的源程式,其中包含公用函式hello,該函式將在螢幕上輸出"Hello XXX!"。

  main.c(見程式3)為測試庫檔案的主程式,在主程式中呼叫了公用函式hello。

  程式1: hello.h

檢視文字列印
  1. #ifndef HELLO_H  
  2. #define HELLO_H  
  3. void hello(constchar *name);  
  4. #endif//HELLO_H
檢視文字列印
  1. #ifndef HELLO_H  
  2. #define HELLO_H  
  3. void hello(constchar *name);  
  4. #endif//HELLO_H

  程式2: hello.c

檢視文字列印
  1. #include
  2. void hello(constchar *name)  
  3. {  
  4.     printf("Hello %s!/n", name);  
  5. }  
  6. 程式3: main.c  
  7. #include"hello.h"
  8. int main()  
  9. {  
  10.     hello("everyone");  
  11.     return0;  
  12. }  
檢視文字列印
  1. #include
  2. void hello(constchar *name)  
  3. {  
  4.     printf("Hello %s!/n", name);  
  5. }  
  6. 程式3: main.c  
  7. #include"hello.h"
  8. int main()  
  9. {  
  10.     hello("everyone");  
  11.     return0;  
  12. }  

       第2步:將hello.c編譯成.o檔案;

  無論靜態庫,還是動態庫,都是由.o檔案建立的。因此,我們必須將源程式hello.c通過gcc先編譯成.o檔案。

  在系統提示符下鍵入以下命令得到hello.o檔案。

檢視文字列印
  1. # gcc -c hello.c  
  2. #  
檢視文字列印
  1. # gcc -c hello.c  
  2. #  

  (注1:本文不介紹各命令使用和其引數功能,若希望詳細瞭解它們,請參考其他文件。)

  (注2:首字元"#"是系統提示符,不需要鍵入,下文相同。)

  我們執行ls命令看看是否生存了hello.o檔案。

檢視文字列印
  1. # ls  
  2. hello.c hello.h hello.o main.c  
  3. #  
檢視文字列印
  1. # ls  
  2. hello.c hello.h hello.o main.c  
  3. #  

  (注3:首字元不是"#"為系統執行結果,下文相同。)

  在ls命令結果中,我們看到了hello.o檔案,本步操作完成。

  下面我們先來看看如何建立靜態庫,以及使用它。

  第3步:由.o檔案建立靜態庫;

  靜態庫檔名的命名規範是以lib為字首,緊接著跟靜態庫名,副檔名為.a。例如:我們將建立的靜態庫名為myhello,則靜態庫檔名就是libmyhello.a。在建立和使用靜態庫時,需要注意這點。建立靜態庫用ar命令

  在系統提示符下鍵入以下命令將建立靜態庫檔案libmyhello.a。

檢視文字列印
  1. # ar cr libmyhello.a hello.o  
  2. #  
檢視文字列印
  1. # ar cr libmyhello.a hello.o  
  2. #  

  我們同樣執行ls命令檢視結果:

檢視文字列印
  1. # ls  
  2. hello.c hello.h hello.o libmyhello.a main.c  
  3. #  
檢視文字列印
  1. # ls  
  2. hello.c hello.h hello.o libmyhello.a main.c  
  3. #  

  ls命令結果中有libmyhello.a。

  第4步:在程式中使用靜態庫;

  靜態庫製作完了,如何使用它內部的函式呢?只需要在使用到這些公用函式的源程式中包含這些公用函式的原型宣告,然後在用gcc命令生成目標檔案時指明靜態庫名,gcc將會從靜態庫中將公用函式連線到目標檔案中。注意,gcc會在靜態庫名前加上字首lib,然後追加副檔名.a得到的靜態庫檔名來查詢靜態庫檔案

  在程式3:main.c中,我們包含了靜態庫的標頭檔案hello.h,然後在主程式main中直接呼叫公用函式hello。下面先生成目標程式hello,然後執行hello程式看看結果如何。

相關推薦

問題集合 ---- linux 靜態動態建立檢查使用建議

=================================================================== linux靜態庫和動態庫分析 本文轉自 http://www.linuxeden.com/html/develop/20100326/94297.html

Linux中如何建立靜態動態

函式庫分為靜態庫和動態庫兩種。   靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。   動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。   程式1: hello.h   #ifndef HELLO

關於Linux靜態動態的分析

所在 mis color 先後 main 技術 哪些 共享 協議 關於Linux靜態庫和動態庫的分析 關於Linux靜態庫和動態庫的分析 1.什麽是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可運行代碼的二進制形式。能夠被操作系

linux下的靜態動態

列表 可執行文件 運行時 打包 文件的 ade 命令 div library 一、linux下的靜態庫 靜態庫中的被調用的函數的代碼會在編譯時一起被復制到可執行文件中去的!!可執行文件在運行不需要靜態庫的存在! 二、linux下動態庫的構建和使用 1、動態庫的構建

linux+vs2013編譯靜態動態

cal 控制 文件 urn 運行時 names c++ spec using Linux下創建與使用靜態庫 Linux靜態庫命名規則 Linux靜態庫命名規範,必須是"lib[your_library_name].a":lib為前綴,中間是靜態庫名,擴展名為.a。 創建靜態

linux 靜態動態(共享)的制作與使用(註意覆蓋問題)

png 環境變量 src bfile idt 鏈接器 問題 靜態 插入 一、linux操作系統支持的函數庫分支   靜態庫:libxxx.a,在編譯時就將庫編譯進可執行程序     優點:程序的運行環境中不需要外部的函數庫     缺點:可執行程序大   動態庫:又

靜態動態的區別win平臺linux平臺代碼實現

linux動態庫 聲明 CP 控制臺程序 後綴 差異 創建 SM mes 什麽是庫   庫是寫好的,現有的,成熟的,可以復用的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。   本質上來說,庫是一種可

linux 靜態動態生成

靜態庫 ar rcs libxxx.a xx1.o xx2.o 生成靜態庫 c 建立一個庫 s 建立目標檔案索引,在建立較大的庫時,能加快時間 rablib libxxx.a 為庫檔案建立索引。 ar t libxxx.a 檢視庫檔案內所含目標檔名字 ar -tv lib

C語言函式篇(五)靜態動態建立使用

使用庫函式是原始碼的一種保護?我猜的. 庫函式其實不是新鮮的東西,我們一直都在用,比如C庫. 我們執行pringf() 這個函式的時候,就是呼叫C庫的函式.   下面記錄靜態庫和動態庫的生成和使用.   靜態庫:libxxx.a 動態庫:libxxx.so  

Linux C 靜態動態

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

Linux靜態動態的命名規則編譯連結

1、Linux靜態庫和動態庫的命名規則 靜態函式庫 靜態庫的名字一般是libxxx.a,利用靜態庫編譯生成的檔案比較大,因為整個靜態庫所有的資料都會被整合進目的碼中。 a)優點 編譯後,可執行檔案不需要外部支援; b)缺點 生成的可執行程式大;靜態庫改變了,就

Linux靜態動態的設計

靜態庫和動態庫的設計 宗旨:技術的學習是有限的,分享的精神是無限的。 Linux應用程式設計中需要的外部函式主要由函式庫和系統呼叫來提供 Linux應用程式使用的主要函式庫均存放於/lib, /usr/lib目錄下,其中採用*.so.*方式命名的是動態函式庫,而以*.a

linux 程式碼封裝成靜態動態使用(待續)

問題是這樣的,自己的程式碼實現了一個數據分類的功能,如何把這部分程式碼完全打包成動態庫和標頭檔案,提供API給別人呼叫呢?如果沒有使用其它的依賴庫或者其它開原始碼,那麼可以直接按照gcc編譯器生成和使用靜態/動態庫的方式。可以參考部落格:按照這篇部落格裡面的操作,基本可以完成

Linux靜態動態的製作使用

Linux作業系統支援的庫函式分為;   1.靜態庫:libxxx.a  在編譯時就將庫函式編譯進可執行程式中.      優點.  程式執行環境中不需要外部的函式庫.       缺點: 可執行程

Linux靜態動態(共享

Linux作業系統支援的函式庫分為靜態庫和動態庫,動態庫又稱共享庫。linux系統有幾個重要的目錄存放相應的函式庫,如/lib /usr/lib。 靜態函式庫:       這類庫的名字一般是libxxx.a;利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目的碼中,他的優點就顯而易見了

Linux 靜態動態的製作使用

一、linux作業系統支援的函式庫分支   靜態庫:libxxx.a,在編譯時就將庫編譯進可執行程式     優點:程式的執行環境中不需要外部的函式庫     缺點:可執行程式大   動態庫:又稱共享庫,libxxx.so,在程式執行時將庫載入到可執行程式中    

linux 下編譯生成靜態動態

我們此處為了說明靜態庫和動態庫的編譯,會使用示例程式碼。建立  test.h, hello.cpp 和 world.cpp, 在兩個原始檔中分別實現兩個函式( 此處都是示例程式碼,檔案命名不規範,理解意思即可 )。test.h (靜態庫標頭檔案)#ifndef _TEST_

淺析靜態動態的區別及linux下二者的生成使用

從程式設計的角度來講,庫檔案通常被分為靜態庫檔案和動態庫檔案,其目的在於將部分程式碼封裝在一起編譯後供自己或他人呼叫,好處在於編譯後的庫檔案看不到原始碼,可保密,同時不會因為不小心修改了函式而出問題,便於維護。但是二者之間存在一定的差異。     1.靜態庫:   &n

Linux下gcc編譯器生成使用靜態動態學習筆記

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連結並拷貝到目的碼中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被拷貝到目的碼中,而是在程式執行時才被載入,因此在程式執行時還需要動態庫存在。本質上說庫是一

Linux下gcc生成使用靜態動態詳解

一、基本概念 1.1什麼是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 由於windows和linux的平臺不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二