一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - VS2010中lib與dll文件的生成與使用方法

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

2022-02-19 15:46C#教程網 C#

這篇文章主要介紹了VS2010中lib與dll文件的生成與使用方法,需要的朋友可以參考下

一、 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

?
1
2
3
4
5
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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);//釋放dll
return 0;
}

 靜態加載過程:

1)、加載lib文件:

法一:預編譯命令#pragma comment(lib,"JsPlayer.lib")

法二:通過資源文件加入lib文件

法三:工程屬性——鏈接器——輸入——附加依賴項

2)、包含頭文件

3)、dll文件中的函數對于程序可見

?
1
2
3
4
5
6
7
#include"func_add_min.h"
int main()
{
cout<<add(1,2)<<endl;
cout<<MIN(1,2)<<endl;
return 0;
}

注意:如果是類的封裝,頭文件需要做簡單的修改

?
1
2
3
4
5
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)

注意:

?
1
2
3
4
5
6
#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

?
1
2
3
4
5
#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#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
主站蜘蛛池模板: 亚洲激情欧美 | 亚洲成年人免费网站 | 国产性色视频 | 国产男女性特黄录像 | 日韩一品在线播放视频一品免费 | 啪一啪在线视频 | 国产精品毛片无码 | 亚洲黄网站wwwwww | 国产梦呦精品 | 99久久精品免费看国产一区 | 蝴蝶传媒3o45 | 国产美女做爰免费视频软件 | 日韩精品中文字幕视频一区 | 免费看片aⅴ免费大片 | 欧美国产日韩1区俺去了 | 91欧美秘密入口 | 亚洲精品6久久久久中文字幕 | 欧美精品99| 欧亚精品一区二区三区 | 国产在线观看福利片 | 色综合久久中文字幕 | 国产成人99久久亚洲综合精品 | 动漫美女人物被黄漫在线看 | 操弄哥哥的108种姿势 | 国内自拍网红在线综合 | 无套暴躁白丝秘书 | 久久九九有精品国产23百花影院 | 精品牛牛影视久久精品 | 欧式午夜理伦三级在线观看 | 亚洲精品福利你懂 | 91亚洲精品丁香在线观看 | 亚洲a视频在线 | bl超h 高h 污肉快穿np | 日韩一区二区三 | 国产里番 | 国产欧美日韩免费一区二区 | 高清日韩在线 | 亚洲免费视 | 99久久免费看精品国产一区 | 亚洲精品福利一区二区在线观看 | 草草免费观看视频在线 |