動態鏈結庫:dll不必被包含在最終的exe中,exe檔案執行時可以動態地引用和解除安裝dll檔案。
同時,靜態鏈結庫中不能再包含其他的動態鏈結庫或靜態庫,而動態鏈結庫中可以包含其他的動態或靜態庫。
vc++支援的dll:
dll的編制與具體的程式語言及編譯器無關,動態鏈結庫隨處可見,vc++支援三種dll:非mfc動態庫、mfc規則dll和mfc擴充套件dll。dll匯出函式(或變數、類)可**用程式呼叫;dll內部函式只能在dll程式內使用,應用程式無法呼叫它們。
匯出函式的宣告方式:
一種在函式宣告型別和函式名之間加上「_declspec(dllexport)」。
另外一種採用模組定義(.def)檔案宣告,需要在庫工程中新增模組檔案,格式如下:
library 庫工程名稱
exports 匯出函式名
dll的呼叫方式:
一種靜態呼叫,由編譯系統完成對dll的載入和應用程式結束時dll的解除安裝。
另外一種動態呼叫,由程式設計者用api函式載入和解除安裝dll(dll載入—dll函式位址獲取—dll釋放)方式。
所有庫工程編譯時必須release方式:
build—set active configuration—選擇庫工程的release方式
示例:2. 一、 函式----建立動態鏈結庫(mfc規則dll)
1. new--projects--mfc appwizard(dll)--regular dll using shared mfc dll //取名為mfc_dll
2. def檔案中新增:函式名(add_new)
3. **件中新增:外部函式宣告//求和函式,函式名為add_new
extern "c" __declspec(dllexport) int __stdcall add_new(int a,int b);
4. cpp檔案中新增: 外部函式實現
extern "c" __declspec(dllexport) int __stdcall add_new(int a,int b)
5. build--set active configuration--win32 release--ok
6. 生成
7. 根目錄下release資料夾中dll,lib與根目錄下**件即為所需
3. 二、 函式----呼叫動態鏈結庫(把mfc_和mfc_拷到工程所在目錄)
//靜態呼叫(.h可以寫到.cpp檔案中)
1. new--projects--win32 console application--an empty project
2. 新增**件:(
#pragma comment(lib,"mfc_") //告訴編譯器dll相對應的lib檔案所在路徑和檔名
extern "c" _declspec(dllimport) int _stdcall add_new(int a,int b);//宣告匯入函式
3. 新增cpp檔案:(
#include ""
int main()
freelibrary(hdll);//釋放已經載入的dll模組
} return 0;
}4. 三、 變數----建立動態鏈結庫(非mfc dll)
1. new---projects---win32 dynamic-link library----an empty project(sample)
2. 新增
#ifndef sample_h
#define sample_h
extern int dllglobalvar;
#endif
3. 新增
#include ""
#include <>
int dllglobalvar;
bool apientry dllmain(handle hmodule,dword ul_reason_for_call,lpvoid lpreserved)
//windows在載入dll時,需要乙個入口函式,就如同控制台或dos程式需要main函式、win32程式需要winmain函式一樣。所以引入乙個不做任何操作的預設dllmain的函式版本。是dll的內部函式。
動態鏈結庫dll學習總結
1.什麼是lib檔案,lib和dll的關係如何 1 lib是編譯時需要的,dll是執行時需要的。如果要完成源 的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了。在開發和除錯階段,當然最好都有。2 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式...
第十四章動態鏈結庫
第十四章動態鏈結庫 visual c 6.0 程式設計例項與技巧 一建立s14 dll 1 這個擴充套件mfc extension dll 向應用程式提供的功能有 1 建立工程 2 設計共享資料 pragma data seg myshareddata 宣告乙個共享資料段用於程序使用dll的記數 i...
linux下動態庫靜態庫鏈結路徑設定問題
g gcc 連線 so動態庫或者 a靜態庫時,需要設定這些動態庫的路徑,例如 g o main l.lib ldymamic lpthread lrt 這些是設定到哪個目錄下去查詢關聯的動態庫。如果在 l目錄下面找不到相應的動態庫,就會到 ld library path 的目錄下去找,如果還找不到,...