很多時候我們寫**的時候會經常用到某些**段,比方說求兩個或幾個整數的和或者將乙個整形陣列轉化為二叉樹等等。經常使用這些**,但是每一次又得重新再寫一遍,次數多了等於就是重複無用勞動了。所以,可以自己動手寫乙個自己的動態鏈結庫,儲存起來。下次用到只需要加上庫就ok了,這樣既方便了自己又對動態鏈結庫本身的工作原理理解更深了。
windows的鏈結庫和linux的鏈結庫在實現原理上大同小異,只是名字有點區別罷了。鏈結庫分兩種,動態的和靜態的。windows下分別用.lib和.dll來表示,而linux下用.a和.so來表示。靜態鏈結庫是指編譯**時即將整個庫編到可執行檔案中,此時該程式完全擁有庫所實現的功能,即執行時不再和庫有任何瓜葛。動態鏈結庫則不一樣,編譯時只是將庫中所用到的函式和功能的入口位址編譯到可執行檔案中,當程式執行到該函式時,程式即跳轉到庫的函式入口處,因此它們之間是動態的聯絡在一起的。
linux下動態鏈結庫有一套自己的命名方法,只有正確命名才能夠正確的載入和執行。方法為lib***.so.x,其中***表示名字,一般來說就是該so庫的作用,後面的x表示版本號,因為so庫往往會有版本公升級。如:libply.so.4.4.0
而在載入時往往用的是該so庫的軟鏈結,如果版本公升級了只需要將軟鏈結鏈到最新的so庫就能解決問題,所以這種方法很實用。
下面編寫乙個兩個整數相加的動態庫。
動態庫原始碼add.cc
int add(int x, int y)
編譯
g++ add.cc -fpic -shared -o libadd.so
-fpic 是指編譯的so庫不依賴於具體路徑。
生成libadd.so
測試**原始碼test.cc
#includeint add(int,int);
int main()
#ifndef windll_h
#define windll_h
#ifdef __cplusplus
#define export extern "c" __declspec (dllexport)
#else
#define export __declspec (dllexport)
#endif
export int sum (int a, int b);
#endif
編譯,ctrl+shift+b
此時debug資料夾中生成了windll.dll
新建測試工程,testcode
main.cpp
#include #include using namespace std;
int main()
vs新增動態庫,todo:) 靜態鏈結庫和動態鏈結庫編寫
lib.h int add int x,int y lib.cpp include lib.h include stdafx.h int add int x,int y libtest.cpp include lib.h pragma comment lib,lib.lib int main int...
編寫 dll動態鏈結庫
dll程式設計學習 首先要知道,在vc 6.0環境中,在c呼叫約定和c編譯環境下使用 declspec dllexport 關鍵字可以匯出不帶任何修飾符的函式名。dll函式的約定有兩種 呼叫約定和函式名修飾約定。呼叫約定又分為 stdcall呼叫約定,cdecl c呼叫約定 和 fastcall呼叫...
linux c 動態鏈結庫so編寫
linux下的動態鏈結庫是.so檔案,即 shared object,下面是乙個簡單的例子說明如何寫.so以及程式如何動態載入.so中的函式和物件。testso.h ifndef testso h define testso h extern c endif testso h testso.cpp ...