動態鏈接庫不是Linux獨有的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態連接庫是以*.dll作為結尾的,而linux下面的動態連接庫是以*.so結尾的。和靜態鏈接庫相比,動態連接庫可以共享內存資源,這樣可以減少內存消耗。另外,動態連接是需要經過操作系統加載器的幫助才能被普通執行文件發現的,所以動態連接庫可以減少鏈接的次數。有了這個特點,我們就不難發現為什么很多軟件的補丁其實都是以動態庫發布的。
那么,在Linux上動態庫是怎么生成的呢?
- #include "test.h"
- int add(int a, int b)
- {
- return a + b;
- }
- #ifndef _TEST_H
- #define _TEST_H
- int add(int a, int b);
- #endif
- #include <stdio.h>
- #include "test.h"
- int main()
- {
- printf("%d\n", add(2, 3));
- return 1;
- }
這個時候,有的朋友就會問了,那在windows下面dll應該怎么編寫呢?其實也不難,只要在test.h上面稍作改變即可。其他的步驟和 靜態庫的操作是基本類似的。
- #ifndef _TEST_H
- #define _TEST_H
- #ifdef USR_DLL
- #define DLL_API _declspec(dllexport)
- #else
- #define DLL_API _declspec(dllimport)
- #endif
- DLL_API int add(int a, int b);
- #endif
今天我們討論的問題是靜態庫。為了顯示windows和Linux創建靜態庫之間的差別,我們首先在windows上面利用Visual C++6.0創建一個靜態庫。源文件的代碼很簡單,
- #include "test.h"
- int add(int a, int b)
- {
- return a + b;
- }
- #ifndef _TEST_H
- #define _TEST_H
- int add(int a, int b);
- #endif
如果你需要在windows上面創建一個靜態庫,那么你需要進行下面的操作,
(1)打開visual C++ 6.0工具,單擊【File】-> 【New】->【Projects】(2)選擇【Win32 Static Library】,同時在【Project Name】寫上項目名稱,在【Location】選擇項目保存地址
(3)單擊【Ok】,繼續單擊【Finish】,再單擊【Ok】,這樣一個靜態庫工程就創建好了
(4)重新單擊【File】->【New】->【Files】,選擇【C++ Source Files】,
(5)選中【Add to pproject】,將源文件加入到剛才創建的工程中去,在File中輸入文件名+.c后綴
(6)重復4、5的操作,加入一個文件名+.h頭文件
(7)分別在頭文件和源文件中輸入上面的代碼,單擊F7按鈕,即可在Debug目錄中生成*.lib靜態庫文件
那么,在linux下面應該怎么運行呢?其實很簡單,兩條命令解決,
(1)首先生成*.o文件,輸入gcc -c test.c -o test.o
(2)利用ar命令生成靜態庫,輸入ar rc libtest.a test.o
此時如果還有一個hello.c文件使用到了這個靜態庫,比如說 ,
- #include <stdio.h>
- #include "test.h"
- int main()
- {
- printf("%d\n", add(2, 3));
- return 1;
- }
其實也很簡單,輸入一個簡單的命令就可以生成執行文件了,
(1)首先輸入gcc hello.c -o hello ./libtest.a
(2)輸入./hello,驗證生成的執行文件是否正確
(3)朋友們可以刪除libtest.a文件,重新輸入./hello,驗證執行文件是否可以正常運行
