国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

VS2010中lib與dll文件的生成與使用方法

2019-10-29 21:06:38
字體:
來源:轉載
供稿:網友

一、 lib文件的簡介

.lib是一種文件后綴,是Windows操作系統的庫文件,有靜態lib和動態lib之分:
1)、靜態lib文件:將導出的文件的聲明和實現都放在lib文件中,此時lib文件主要包含函數的實現部分(cpp文件),例如類的函數定義。使用時只需配合相關的頭文件,編譯后程序將lib文件中的代碼嵌入到宿主程序中,也就是最后的exe文件中,此時移除lib文件,程序可以正常運行,即編譯后就不需要lib文件的支持了。
2)、動態lib文件:相當于是一個h頭文件,用于支持相應的dll文件的運行。里面存儲的是dll文件中各個導出函數的地址,達到鏈接主程序與dll文件的目的。
二、dll文件的生成
vs2010生成dll文件,生成dll文件的時候需要對應的lib文件才能使用,dll生成方法如下(此處只是生成部分,在使用時還需修改):
1) 新建工程,選擇“win32項目”,注意不是“win32控制臺項目”,下一步選擇生成dll文件,其余默認;
2) 添加需要封裝的.cpp文件,并加入對應的.h文件,先說明類的封裝(也就是類的cpp文件)
頭文件.h
class __declspec(dllexport) NB (類的頭文件中只需修改此處即可){public:private:}
其中關鍵字dllexport說明該類的實現部分需要導出。
源文件.cpp
添加一句#include "stdafx.h"即可 
再說明一下一般函數的封裝
將函數的定義改為extern  "C"  __declspec(dllexport)  float add(float  a, float  b);
extern  "C"  __declspec(dllexport)  float MIN(float a,float b);
float MAX(float a,float b);
函數MAX為導出到dll文件中,因此相當于不可見。
 注意:若發現只生成了dll文件,而沒有對應的lib文件,需要將cpp文件中的函數實體放到與工程同名的cpp文件下,并將原來的cpp文件刪除,重新rebuild all即可。
 3)編譯,在debug目錄下會生成對應的 .lib 和 .dll文件。
dll文件的使用
dll文件的使用分為動態加載和靜態加載,兩種方法優勢都很明顯:
動態加載:在程序中用程序顯示加載dll文件,通過函數GetProcAddress找到對應的函數的地址,利用函數指針直接訪問對應的函數。該方法不需要lib文件的支持,也不需要包含對應的頭文件,但是需要顯式的加載dll文件,這也就意味著dll文件在編譯的時候就已經被鏈接,且使用不是很方便,函數指針容易出錯。
靜態加載:只加載對應的lib文件(是一些函數鏈接的信息,一般比較小),不加載dll文件,編譯的時候只需要lib文件的支持,在運行的時候才調用dll文件的函數。此處lib文件和dll文件都放在工程目錄下,且需要包含對應的頭文件。
Windows中dll、exe都是可執行的文件,但是exe可以直接被操作系統調用執行,而dll文件不能,因此當有進程調用dll文件中函數時,直接即可運行。
動態加載過程:
1)、加載dll
2)、取函數地址
3)、釋放dll
#include <Windows.h>     // 包含 HINSTANCE#include <iostream>using namespace std; int main(){HINSTANCE his = LoadLibraryA("to_test1.dll");//用于加載dll typedef float(*Add)(float a,float b);Add add1 = (Add)GetProcAddress(his,"add");//GetProcAddress()用于獲得函數地址  typedef float(*Min)(float a,float b);Min add2 = (Min)GetProcAddress(his,"MIN");cout<<add1(2,3)<<endl;cout<<add2(2,3)<<endl; FreeLibrary(his);//釋放dllreturn 0;}
 靜態加載過程:
1)、加載lib文件:
法一:預編譯命令#pragma comment(lib,"JsPlayer.lib")
法二:通過資源文件加入lib文件
法三:工程屬性——鏈接器——輸入——附加依賴項
2)、包含頭文件
3)、dll文件中的函數對于程序可見
#include"func_add_min.h"int main(){cout<<add(1,2)<<endl;cout<<MIN(1,2)<<endl;return 0;}
注意:如果是類的封裝,頭文件需要做簡單的修改
class __declspec(dllexport) NB {public:private:}
lib文件與dll
  (1)lib是編譯時需要的,dll是運行時需要的。
  如果要完成源代碼的編譯,有lib就夠了。
  如果也使動態連接的程序運行起來,有dll就夠了。
  在開發和調試階段,當然最好都有。
  (2)一般的動態庫程序有lib文件和dll文件。lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調用的。如果有dll文件,那么對應的lib文件一般是一些索引信息,具體的實現在dll文件中。如果只有lib文件,那么這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程序才行。
  (3)在動態庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據并不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。從上面的說明可以看出,DLL文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。
加載LIB文件方法
直接加入
  在VC中打開File View一頁,選中工程名,單擊鼠標右鍵,然后選中"Add Files to Project"菜單,在彈出的文件對話框中選中要加入DLL的LIB文件即可。
設置工程的 Project Setting
  打開工程的 Project Settings菜單,選中Link,然后在Object/library modules下的文本框中輸入DLL的LIB文件。
通過程序代碼
  加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令鏈接不同版本的LIB文件。因為,在Debug方式下,產生的LIB文件是Debug版本,如Regd.lib;在Release方式下,產生的LIB文件是Release版本,如Regr.lib。
  當應用程序對DLL的LIB文件加載后,還需要把DLL對應的頭文件(*.h)包含到其中,在這個頭文件中給出了DLL中定義的函數原型,然后聲明。

vs2010如何生成.DLL和.lib庫(SDK)

1、新建一個空項目.exe或者.DLL或者.lib都可以,本例子用.exe為例

新建工程--空項目,取名testDetect

2、c++文件testDetect.cpp

內容如下:_declspec(dllexport) 一定要加在函數聲明和定義前面,否則在生成.dll的時候不會生成.lib(生成.dll的時候一般都會生成.lib,生成.lib的時候只有.lib)

注意:

#include "testDetec.h"_declspec(dllexport) int testDetect(short* refPcm, int refLen, int refSamprate, int refChannel, short* micPcm, int micLen, int micSamprate, int micChannel){int resulut=0;return resulut;}

c++文件testDetect.h

#ifndef _testDetect_H_#define _testDetect_H__declspec(dllexport) int testDetect(short* refPcm, int refLen, int refSamprate, int refChannel, short* micPcm, int micLen, int micSamprate, int micChannel);#endif

3、設置

如果想要生成.dll此時修改設置:屬性--配置屬性--常規--項目默認值--配置類型(三個選擇:應用程序.exe,動態庫.dll,靜態庫.lib等)--動態庫.DLL
然后buid,再按F6就可以生成動態庫了,在工程目錄文件夾里的Dubug下面就有testDetect.dll和testDetect.lib,給別人調用時只要將testDetec.h和testDetect.dll和testDetect.lib給別人就可以了
同理可以生成.lib庫


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 抚远县| 伊宁市| 丹棱县| 乌海市| 临安市| 郧西县| 吉安县| 湖口县| 绥滨县| 中卫市| 广饶县| 措美县| 故城县| 乌兰察布市| 建瓯市| 同仁县| 右玉县| 尚义县| 兴安盟| 呼伦贝尔市| 东丰县| 临夏县| 北川| 遂平县| 汤阴县| 通州区| 奉节县| 崇文区| 揭西县| 互助| 长沙县| 奉节县| 广宁县| 离岛区| 白银市| 西乌珠穆沁旗| 称多县| 陈巴尔虎旗| 宁都县| 韶山市| 西乌|