下面通過乙個簡單的例子開始介紹linux動態鏈結庫的生成和使用。
不需要宣告export匯出符號,只需要編譯器設定即可。如下:
void show()
儲存為testso.c檔案,按照如下編譯:
$ gcc -fpic -shared -o libtestso.so testso.c
執行生成乙個libtestso.so檔案,按照linux標準物件的命名慣例,應該在庫名稱之前加上"lib"字首,儘管不是必須的。編譯開關-fpic代表函式符號可以重定向,-shared代表編譯結果是乙個標準物件。
int main()
儲存為test.c,按照如下gcc開關編譯:
$ gcc -o test test.c ./libtestso.so
編譯生成test可執行檔案。如上編譯條件的最後一條需要是所呼叫的標準物件檔名,注意必須含有路徑。如果只是使用libtestso.so,則必須確保這個檔案在可訪問的path下面。本例所使用的檔名"./libmyso.so"是當前路徑下的,使用了相對路徑。
$ ./test
無論靜態庫,還是動態庫,都是由.o檔案建立的。因此,我們必須將源程式testso.c通過gcc先編譯成.o檔案。
在系統提示符下鍵入以下命令得到testso.o檔案。
$ gcc -c testso.c
在ls命令結果中,我們看到了hello.o檔案,本步操作完成。
下面我們先來看看如何建立靜態庫,以及使用它。
靜態庫檔名的命名規範是以lib為字首,緊接著跟靜態庫名,擴充套件名為.a。例如:我們將建立的靜態庫名為testso,則靜態庫檔名就是libtestso.a。在建立和使用靜態庫時,
需要注意這點。建立靜態庫用ar命令。
在系統提示符下鍵入以下命令將建立靜態庫檔案libtestso.a。
$ ar crv libtestso.a testso.o
ls命令結果中有libmyhello.a。
靜態庫製作完了,如何使用它內部的函式呢?只需要在使用到這些公用函式的源程式中包含這些公用函式的原型宣告,然後在用gcc命令生成目標檔案時指明靜態庫名,gcc將會從靜態庫中將公用函式連線到目標檔案中。注意,gcc會在靜態庫名前加上字首lib,然後追加副檔名.a得到的靜態庫檔名來查詢靜態庫檔案。
$ gcc test.c libtestso.a -o test
$ ./test
我們刪除靜態庫檔案試試公用函式hello是否真的連線到目標檔案 hello中了。
$ rm libtestso.a
rm: remove regular file `libtestso.a'? y
$ ./test
linux下建立靜態庫與動態庫
靜態庫 編寫好c原始檔,裡面只有函式的實現。要呼叫的檔案比如是main.c,在檔案裡宣告c原始檔裡的庫函式名。1 首先 gcc c hello.c 生成hello.o 2 ar crs libhello.a hello.o 3 gcc o main main.c l.lhello l後面跟著庫的路徑...
Linux下製作動態庫與靜態庫
靜態函式庫 1.這類庫的名字一般是lib a 2.利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進可執行檔案了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程...
Linux下的靜態庫與動態庫
準備三個檔案 time.c time.h test.c。函式庫的標頭檔案 ifndef time h define time h includevoid time endif time h 函式庫的源程式,包含時間列印函式 include time.h void time 測試函式,呼叫了時間列印函...