1. 程式人生 > >linux c 語言程式設計環境:動態庫和靜態庫的製作

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

庫: 庫用於將相似函式打包在一個單元中。然後這些單元就可為其他開發人員所共享,並因此有了模組化程式設計這種說法 — 即,從模組中構建程式。Linux 支援兩種型別的庫,每一種庫都有各自的優缺點。靜態庫包含在編譯時靜態繫結到一個程式的函式。動態庫(也叫共享庫)則不同,它是在載入應用程式時被載入的,而且它與應用程式是在執行時繫結的。Linux系統有幾個重要的目錄存放相應的函式庫,如/lib, /usr/lib; 標頭檔案放在/usr/include。

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

動態庫 :這類庫的名字一般是libxxx.so,動態庫又稱共享庫;相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目的碼中,你的程式執行到相關函式時才呼叫函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的升級比較方便。而且如果多個應用程式都要使用同一函式庫,動態庫就非常適合,可以減少應用程式的體積。

靜態庫製作:
      gcc -c file1.c
      gcc -c file2.c
      ....
      gcc -c fileN.c
      ar -rcs  libname.a   file1.o  file2.o  ... fileN.o


動態庫製作:
      gcc -shared  -fpic  -o libname.so  file1.c  file2.c ... fileN.c


編譯:

     gcc main.c -o  test_lib   -L lib_path  -lname

編譯:
[[email protected] app]$ gcc main.c 
main.c:14:20: error: crypto.h: No such file or directory
-I   指定標頭檔案的路徑    


連結:
[[email protected] app]$ gcc -static  main.c -o app -L./libs -lcrypto -lfunc
/tmp/ccfrMcUo.o: In function `main':
main.c:(.text+0xa): undefined reference to `crypt0'
collect2: ld returned 1 exit status
-L  指定庫的路徑     -l   指定庫的名字 -I 指定標頭檔案路徑
動態庫和靜態庫同時存在,預設是使用動態庫。如果要用靜態庫,加上-static連結選項。


執行:

[[email protected] app]$ ./app 

./app: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
LD_LIBRARY_PATH:  告訴系統執行程式的時候,除了/lib, /usr/lib以外還到哪裡找動態庫。

PATH: 告訴系統執行的Linux命令查詢的路徑。

下面我們來舉個例子:

在建立函式庫前,我們先來準備舉例用的源程式,並將函式庫的源程式編譯成.o檔案。

一:編輯得到舉例程式——

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

test.c(見程式2)是函式庫的源程式。

main.c(見程式3)為測試庫檔案的主程式。

程式1:test.h

#ifndef  _TEST_H_

 #define  _TEST_H_

         int   g_var;
               extern  int add(int a, int b);
  

      #endif   /* ----- #ifndef _TEST_H_  ----- */

程式2:test.c

   int add(int a, int b)
   {
    return a+b;
   }

程式3:main.c

   #include <stdio.h>
        #include "test.h"
  

  #define MIN    1

 #define MAX  4  

  int main (int argc, char **argv)

{
   add(MIN, MAX);

     #ifdef DEBUG

   printf("Running here <%s:%d> %s()\n", __FILE__, __LINE__, __FUNCTION__);

#endif

 return 0;

 }

第二:將test.c編譯生成test.o檔案

無論是動態庫還是靜態庫,都需要將test.c 編譯成test.o檔案

即:[email protected] 20:35:19 ~/??/gcc  $  gcc -c test.c

用 ls命令檢視是否生成了test.o檔案;

結果如下:main.c  test.c  test.h  test.o

靜態庫製作:[email protected] 20:35:19 ~/??/gcc  $  ar -rcs libppp.a test.o (這類庫的名字一般是libxxx.a,可自己命名

編譯:[email protected] 20:46:19 ~/??/gcc  $  gcc main.c -L. -lppp -I.

用ls命令檢視是否生成a.out檔案

則執行a.out.

動態庫的製作:[email protected] 20:35:19 ~/??/gcc  $  gcc -shared -fpic -o libppp.so test.o

ls命令檢視是否生成了libppp.so檔案

編譯:[email protected] 20:42:55 ~/??/gcc  $  gcc main.c -L. -lppp -I

[email protected] 20:44:06 ~/??/gcc  $  ls

結果如下:[email protected] 20:44:06 ~/??/gcc  $  ls

       a.out  libppp.a  libppp.so  main.c  test.c  test.h  test.o

執行:[email protected] 20:44:08 ~/??/gcc  $  ./a.out

./a.out: error while loading shared libraries: libppp.so: cannot open shared object file: No such file or directory(系統因不知道動態庫在哪裡而產生錯誤)

需要告訴系統這個動態庫在哪裡;

即:[email protected] 20:44:16 ~/??/gcc  $  export LD_LIBRARY_PATH=.
[email protected] 20:46:11 ~/??/gcc  $  gcc main.c -L. -lppp -I.
[email protected] 20:46:17 ~/??/gcc  $  ./a.out

大笑

相關推薦

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

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

《我的第①本c語言程式設計C語言從入門到精通》掃描版.pdf

書籍簡介: 《C語言從入門到精通》以零基礎講解為宗旨,用例項引導讀者深入學習,採取“基礎知識→核心技術→趣味題解→專案實戰”的講解模式,深入淺出地講解C語言的各項技術及實戰技能。《C語言從入門到精通》第1篇【基礎知識】主要講解步入C的世界、常量與變數、資料型別、運算子和表示式、程式控制結構

C語言程式設計 學習筆記 動態記憶體分配(malloc)

如果輸入程式時,先告訴你個數,然後再輸入,要記錄每個資料(類似動態陣列) C99之前應該怎麼做呢? malloc()函式的作用就在此: int *a = (int*)malloc(n*sizeof(int)); malloc()函式的作用是向記憶體申請一個n*

Linux C語言程式設計(下篇) | gdb的使用

前兩篇Linux C語言程式設計(上篇) | gcc的使用和Linux C語言程式設計(中篇) | make的使用講述了在Linux下如何編譯得到可執行程式,那麼當程式執行結果不符合我們的預期時,如何進行除錯呢?這個時候就要使用到gdb工具了~ 1.gdb介紹 gdb也屬於GNU專案

Linux C語言程式設計(中篇) | make的使用

上一篇Linux C語言程式設計(上篇) | gcc的使用講述瞭如何使用gcc進行編譯,其中只是對hello.c這一個檔案進行編譯,那麼當我們需要編譯多個檔案的時候該怎麼做呢? 1.多檔案編譯例項 這個例子中分別在四個檔案(add.c, dec.c, mul.c, div.c)實現相

Linux C語言程式設計(上篇) | gcc的使用

嵌入式軟體開發主要使用C語言開發,編譯過程稱為交叉編譯 —— 在PC機上編譯出可以在嵌入式處理器上執行的程式,在真正進入嵌入式開發前,先來了解下如何使用gcc+make編譯C語言工程,如何用gdb除錯工程~ 1.C程式設計流程 1.1.編輯原始檔(.c) 使用文字編輯器(比如vi

linux c/c++ 動態靜態的生成與使用

二.介紹     從原始碼到可執行程式,通常要經過最重要的兩大步是:編譯,連結。編譯就是將原始檔生成中間檔案的過程,在linux下就是生成  .obj檔案。連結就是用連結器將,這些個中間檔案有序地”糅合“在一起,構成一個可執行檔案。通常,一個.c檔案或者.cpp原始檔編譯後,就會對應生成一個.obj檔案。  

C語言程式設計---3順序程式設計

賦值表示式 賦值運算子按照“自右而左”的結合順序運算。因此 a = (b = 5); a = b = c; a = 5 + (c = 6); a = 11 a = (b = 4) + (c = 6); a = 10; a = (b = 10)/(c =

C語言程式設計---9自定義資料型別

/*輸入學生的學號、姓名、性別、年齡、成績、家庭住址,輸出成績較高的學生資訊*/ #include<stdio.h> void main() { struct student

Linux C語言程式設計(十五)——程序、執行緒與訊號

1、程序 1.1 基本概念 每個程序在核心中都有一個程序控制塊( PCB)來維護程序相關的資訊, Linux核心的程序控制塊是task_struct結構體。 程序ID:統中每個程序有唯一的id,在C語言中用pid_t型別表示,其實就是一個非負整數。 程序狀態:有執行、掛起、

C語言程式設計用泰勒級數求自然數e的近似值

題目:C語言中用泰勒級數求e的近似值,直到最後一項小於 10的負6次方為止次方 e=1+1/1!+1/2!+...+1/n! 描述:觀察公式前兩項可以直接不用計算,合併為2,設定三個float型變數,e為結果,s為分子,i為分母,通過i累加再相乘之後實現分母

Linux C語言程式設計-Linux資料庫操作--LinuxC語言操作SQLServer---知識點總結+例項

*********************注意:為了保證文章的完整性和全面性,作者會不定期對文章進行更新和修正********************* 1.freetds是什麼?     freetds其實就是個軟體而且是一款開源軟體,而且這個軟體支援相當多的系統,比如

Linux下RabbitMQ的編譯,生成動態靜態

執行 編譯 ast lin 目錄 off href apt-get span 一、步驟 1、代碼托管處下載代碼 最新:https://github.com/alanxz/rabbitmq-c/archive/master.zip 穩定:https://g

Linux 動態靜態

Linux作業系統中,依據函式庫是否被編譯到程式內部,將其分為兩大類,靜態函式庫和動態函式庫。 Linux下的函式庫放在/lib或/usr/lib,標頭檔案放在/usr/include。 在既有靜態庫又有動態庫的情況下,預設使用動態庫,如果強制使用靜態庫則需要加-static選項支援。

Linux中的動態靜態(.a.la.so.o)

​ Linux中的動態庫和靜態庫(.a/.la/.so/.o) 原文地址:https://www.cnblogs.com/findumars/p/5421910.html 在windows下,一般可以通過檔案的字尾名來識別檔案的型別。在Linux下大致上也是可以的。但是要明

Linux動態靜態的連結

一、檢視連結了哪些指令 ldd 程式名字 二、在應用程式需要連線外部庫的情況下,linux預設對庫的連線是使用動態庫,在找不到動態庫的情況下再選擇靜態庫。使用方式為: gcc test.cpp -L. -ltestlib 如果當前目錄有兩個庫libtestlib.

Linux下怎麼建立動態靜態

前言 linux下的生成的動態庫和靜態庫沒有windows下方便 linux下gcc編譯預設動態連結和release 程式執行後呼叫動態庫 動態庫: 程式在執行的時候才去連結動態庫的程式碼,多個程式

Linux系統的動態靜態

靜態庫 靜態庫:一些公共程式碼是需要反覆使用,就把這些程式碼編譯為“庫”檔案;在連結步驟中,聯結器將從庫檔案取得所需的程式碼,複製到生成的可執行檔案中的這種庫。 程式編譯一般需經預處理、編譯、彙編和連結幾個步驟。靜態庫特點是可執行檔案中包含了庫程式碼的一份完整拷貝;缺點就是被多次

C語言學習筆記指標函式函式指標的淺析

#include "stdio.h" #include "stdlib.h" #include <string.h> /*--------------指標函式---------------*/  int *f(int a,int b ){        int

linux下g++ 編譯時動態靜態的連結標頭檔案問題

原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。  動態庫在編譯時不會被連線到目的碼中,而是在程式執行