Windows系統和Linux系統中的靜態連結庫與動態連結程式庫(三)

來源:互聯網
上載者:User

      本文主要講述在Linux系統中的靜態連結庫與動態連結程式庫。

      1.Linux系統中的靜態連結庫
      (1)建立標頭檔static_lib.h和源檔案static_lib.c,以及應用靜態庫的主程式檔案main.c,代碼分別如下(與前面Windwos系統那篇代碼基本一樣):

     /*static_lib.h*/<br />#ifndef _STATIC_LIB_H<br />#define _STATIC_LIB_H</p><p>/* 匯入或是匯出的函式宣告 */<br />void test_static_lib_method(void);</p><p>#endif<br />

/*static_lib.c 靜態連結庫對外提供的函數*/<br />#include <stdio.h></p><p>/*通過該宏定義來將標頭檔的函式宣告為匯出函數*/<br />#include "static_lib.h"</p><p>void test_static_lib_method(void)<br /> {<br /> printf("test static library method./n");<br /> }<br />

/*main.c*/</p><p>#include <stdio.h></p><p>#include "static_lib.h"</p><p>int main()<br />{</p><p>printf("Hello, World./n");</p><p>/*(1)測試靜態態連結庫的方法*/<br />test_static_lib_method();</p><p>getchar();</p><p>return 0;<br />}<br />

      (2)輸入命令下面的命令,即可產生static_lib.o的檔案,其中"#"是系統提示符。
          # gcc -c static_lib.c
      (3)由static_lib.o產生靜態庫檔案,靜態庫檔案名稱的命名規範是以lib為首碼,緊接著跟靜態庫名,副檔名為.a。建立命令為cr,其中-c 為建立的意思,-r 為在庫中插入模組(替換)。
         # ar -c -r libstatic_lib.a static_lib.o
      (4)在程式中使用靜態庫,即將靜態庫中的函數添加到程式中。命令如下,其中 -L 指定靜態函數庫的位置,L後面還有'.'表示在目前的目錄下尋找靜態函數庫,-l 則指定了靜態函數庫的名稱,靜態函數庫的命名方式是lib***.a,那麼可以忽略lib和.a。
         # gcc -o main main.c -L. -lstatic_lib
      (5)運行主程式,成功。
         # ./main

      2.Linux系統中的動態連結程式庫

      2.1 建立動態連結程式庫

      (1)建立標頭檔dynamic_lib.h和源檔案dynamic_lib.c, 以及應用動態庫的主程式檔案main.c

/*dynamic_lib.h*/<br />void test_dynamic_lib_method(void);

 

/*dynamic_lib.c*/<br />#include <stdio.h></p><p>#include "dynamic_lib.h"</p><p>void test_dynamic_lib_method(void)<br /> {<br /> printf("test dynamic library method./n");</p><p> }</p><p>

/*main.c*/</p><p>#include <stdio.h></p><p>#include "dynamic_lib.h" </p><p>int main()<br />{</p><p>printf("Hello, World./n");</p><p>/*(1)測試動態連結程式庫的方法*/<br />test_dynamic_lib_method();</p><p>getchar();</p><p>return 0;<br />}<br />

      (2)產生dynamic_lib.o的檔案
           # gcc -c dynamic_lib.c
      (3)建立動態庫
           #  gcc -shared -fPCI -o libdynamic_lib.so dynamic_lib.o
      (4)動態庫的使用與靜態庫的方法是一樣的,如果使用靜態庫和使用動態庫編譯成目標程式時使用的gcc命令完全一樣,則優先使用動態庫。
           # gcc -o main main.c -L. -ldynamic_lib
      (5)運行主程式,報錯,原因沒有找到動態庫。
           # ./main

      2.2 如何找到產生的動態庫有3種方式[1]:
      (1)把動態庫拷貝到/usr/lib或是/lib目錄下。
      (2)將動態庫的路徑加入到LD_LIBRARY_PATH環境變數中。例如動態庫libdynamic_lib.so 在/root/example/目錄下:
      $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/example/
      (3)編輯/etc/ld.so.conf檔案,把庫所在的路徑加到檔案末尾,並執行ldconfig命令重新整理,該命令會重建/etc/ld.so.cache檔案,加入的目錄下的所有庫檔案都可見。

      2.3  查看可執行程式依賴的庫的命令:
      命令:dd,舉例如下
       #ldd ./main
        linux-gate.so.1 =>  (0x0086c000)
        libdynamic_lib.so => /usr/lib/libdynamic_lib.so (0x00de2000)
        libc.so.6 => /lib/libc.so.6 (0x00496000)
        /lib/ld-linux.so.2 (0x00478000)

      2.4 庫檔案的命名規範
     在Linux系統,庫檔案一般放在/usr/lib或者/lib牡蠣下,靜態庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱,動態庫

的名字一般為libxxxx.so.major.minor,xxxx是該lib的名稱,major是主要版本號, minor是副版本號碼。

      2.5 nm命令的用法
nm命令比較簡單而且強大,它用來列出一個目標檔案中的各種符號,符號的種類很多,其中就包括函數名。用下面的命令可以看到

最後一行就是庫的函數名。
#nm libdynamic_lib.so

 

 

[1]http://www.examda.com/linux/fudao/20100903/143434381.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.