MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
生活随笔
收集整理的這篇文章主要介紹了
MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
靜態鏈接庫LIB和動態鏈接庫DLL的區別,創建和示例??
1.什么是靜態連接庫,什么是動態鏈接庫
? 靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,則無論你愿不愿意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以“動態”地引用和卸載這個與 EXE 獨立的 DLL 文件。 靜態鏈接庫和動態鏈接庫的另外一個區別在于靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。 (若是想在MFC應用程序中調用動態鏈接庫DLL,或靜態鏈接庫LIB,又或者是動態鏈接庫DLL中要調用靜態鏈接庫LIB的接口,建議在編譯鏈接時,所有模塊(exe,dll,lib)要么都是MFC作為共享的DLL,要么都MFC作為靜態鏈接庫,或者都用標準的Windows庫,總之可執行程序和DLL或LIB中的調用應保持一致。) ? ? 靜態鏈接庫與靜態鏈接庫調用規則總體比較如下:??
對于靜態鏈接庫(比較簡單):
首先,靜態鏈接庫的使用需要庫的開發者提供生成庫的.h頭文件和.lib文件。
生成庫的.h頭文件中的聲明格式如下:
extern "C" 函數返回類型 函數名(參數表);
在調用程序的.cpp源代碼文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")??
//指定與靜態庫一起鏈接
第二,因為靜態鏈接庫是將全部指令都包含入調用程序生成的EXE文件中。因此如果用的是靜態鏈接庫,那么也就不存在“導出某個函數提供給用戶使用”的情況,要想用就得全要!要不就都別要!:)
對于動態鏈接庫:
動態鏈接庫的使用需要庫的開發者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我們必須先注意到DLL內的函數分為兩種:??
(1)DLL 導出函數,可供應用程序調用;??
(2)DLL 內部函數,只能在 DLL 程序使用,應用程序無法調用它們。
因此調用程序若想調用DLL中的某個函數就要以某種形式或方式指明它到底想調用哪一個函數 #define???_AFXDLL??? ?? #ifndef??_AFXDLL?? ?? ?#pragma?commit(?lib,?"我的靜態庫.lib");?? #else?? ???#pragma?commit(?lib,?"我的動態庫.lib");?? #endif??
1.什么是靜態連接庫,什么是動態鏈接庫
? 靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,則無論你愿不愿意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以“動態”地引用和卸載這個與 EXE 獨立的 DLL 文件。 靜態鏈接庫和動態鏈接庫的另外一個區別在于靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。 (若是想在MFC應用程序中調用動態鏈接庫DLL,或靜態鏈接庫LIB,又或者是動態鏈接庫DLL中要調用靜態鏈接庫LIB的接口,建議在編譯鏈接時,所有模塊(exe,dll,lib)要么都是MFC作為共享的DLL,要么都MFC作為靜態鏈接庫,或者都用標準的Windows庫,總之可執行程序和DLL或LIB中的調用應保持一致。) ? ? 靜態鏈接庫與靜態鏈接庫調用規則總體比較如下:??
對于靜態鏈接庫(比較簡單):
首先,靜態鏈接庫的使用需要庫的開發者提供生成庫的.h頭文件和.lib文件。
生成庫的.h頭文件中的聲明格式如下:
extern "C" 函數返回類型 函數名(參數表);
在調用程序的.cpp源代碼文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")??
//指定與靜態庫一起鏈接
第二,因為靜態鏈接庫是將全部指令都包含入調用程序生成的EXE文件中。因此如果用的是靜態鏈接庫,那么也就不存在“導出某個函數提供給用戶使用”的情況,要想用就得全要!要不就都別要!:)
對于動態鏈接庫:
動態鏈接庫的使用需要庫的開發者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我們必須先注意到DLL內的函數分為兩種:??
(1)DLL 導出函數,可供應用程序調用;??
(2)DLL 內部函數,只能在 DLL 程序使用,應用程序無法調用它們。
因此調用程序若想調用DLL中的某個函數就要以某種形式或方式指明它到底想調用哪一個函數
?
?
而對于一個工程模塊,我們可以將其編譯成動態鏈接庫DLL的文件形式,也可以編譯成靜態鏈接庫LIB的文件。
若想條件編譯的話,可以定義一個標識然后編譯的時候設置這個標識一起編譯。
[cpp]?view plaincopy print?
若是有需要,想將原來以動態鏈接庫DLL編譯的模塊,轉換成靜態鏈接庫LIB的形式,只需要將工程里編譯選項改成以靜態庫方式編譯就行。同時修改下DLL中的導出函數的聲明為普通函數聲明。
?
同時注意,應用程序中調用靜態鏈接庫.lib時,只需要隱式的(即工程配置項里或用#pragma comment)引入.lib文件,因為靜態鏈接庫的lib就是其本身,所以這樣我們就能直接調用靜態鏈接庫里的接口了。【他跟動態鏈接庫DLL在開發角度上,不同的是,DLL需要引入的是鏈接文件.lib,讓編譯器能找到DLL中的接口,其他在使用上都一樣】?
在這提醒下,
靜態鏈接庫文件.lib與動態鏈接庫DLL編譯時產生的.lib鏈接文件是不一樣的,即便它們在Windows中呈現的文件格式是一樣的,動態鏈接文件.lib里面僅僅只是保存了一些動態鏈接導出函數的聲明,有心的朋友,可以比較下它們的大小,你會發現,動態鏈接文件.lib跟靜態鏈接庫文件.lib比起來小很多。
總結
以上是生活随笔為你收集整理的MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习之Windows下安装caffe
- 下一篇: VS2010生成静态库(.lib)