linux下建立函數庫

來源:互聯網
上載者:User
靜態庫在程式編譯時間會被串連到目標代碼中,程式運行時將不再需要該靜態庫。

  動態庫在程式編譯時間並不會被串連到目標代碼中,而是在程式運行是才被載入,因此在程式運行時還需要動態庫存在。

  程式1: hello.h

#ifndef  HELLO_H#define HELLO_Hvoid hello(const char *name);#endif //HELLO_H

  程式2: hello.c

     #include  void hello(const char *name)  {       printf("Hello %s!\n", name);  }

  程式3: main.c

  #include "hello.h"  int main()  {    hello("everyone");    return 0;  }

無論動態庫還是靜態庫都需要用到.o檔案來產生,先編譯產生.o檔案。

  # gcc -c hello.c

1:建立靜態庫

  靜態庫檔案名稱的命名規範是以lib為首碼,緊接著跟靜態庫名,副檔名為.a。例如:我們將建立的靜態庫名為myhello,則靜態庫檔案名稱就是libmyhello.a。

  # ar cr libmyhello.a hello.o

  使用靜態庫:只需要在你的來源程式中加入包含你所需要使用到的函數的聲明(即包含標頭檔),然後在gcc產生目標檔案時候指明靜態庫就OK了(除非你包含的標頭檔在/usr/include,庫檔案在標準庫/usr/lib,/lib下,否則你得顯示指明他們的路徑)

  # gcc -o hello main.c -L. -lmyhello  # ./hello  Hello everyone!

刪除靜態庫檔案運行./hello,程式正常運行,說明靜態庫公用函數已經連結到目標檔案。

  2: 利用.o檔案建立動態庫

  動態庫副檔名為.so

  # gcc -shared -fPCI -o libmyhello.so hello.o 

  動態庫的使用與靜態庫使用方式一樣

  # gcc -o hello main.c -L. -lmyhello  # ./hello  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

哦!出錯了。快看看錯誤提示,原來是找不到動態庫檔案libmyhello.so。程式在運行時,會在/usr/lib和/lib等目錄中尋找需要的動態庫檔案。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程式運行。

  如何找到產生的動態庫有3種方式:

  1)把庫拷貝到/usr/lib和/lib目錄下

  2)在LD_LIBRARY_PATH環境變數中加上庫所在路徑

  例如動態庫libhello.so在/home/example/lib目錄下:

  $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib

3) 修改/etc/ld.so.conf檔案,把庫所在的路徑加到檔案末尾,並執行ldconfig重新整理。這樣,加入的目錄下的所有庫檔案都可見。

  當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.