服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

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#聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题,新手速来围观,一个通俗易懂的例子帮助大家更好的理解C#接口问题,感兴趣的小伙伴们可以参考一下...

    zenkey7072021-12-03
  • C#浅谈C# winForm 窗体闪烁的问题

    浅谈C# winForm 窗体闪烁的问题

    下面小编就为大家带来一篇浅谈C# winForm 窗体闪烁的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网7962021-12-21
  • C#c#学习之30分钟学会XAML

    c#学习之30分钟学会XAML

    一个界面程序的核心,无疑就是界面和后台代码,而xaml就是微软为构建应用程序界面而创建的一种描述性语言,也就是说,这东西是搞界面的...

    C#教程网8812021-12-10
  • C#C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    这篇文章主要介绍了C#实现的文件操作封装类,结合完整实例形式分析了C#封装文件的删除,移动,复制,重命名等操作相关实现技巧,需要的朋友可以参考下...

    Rising_Sun3892021-12-28
  • C#C#基础之泛型

    C#基础之泛型

    泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。接下来通过本文给大家介绍c#基础之泛型,感兴趣的朋友一起学习吧...

    方小白7732021-12-03
  • C#C#直线的最小二乘法线性回归运算实例

    C#直线的最小二乘法线性回归运算实例

    这篇文章主要介绍了C#直线的最小二乘法线性回归运算方法,实例分析了给定一组点,用最小二乘法进行线性回归运算的实现技巧,具有一定参考借鉴价值,需要...

    北风其凉8912021-10-18
  • C#Unity3D UGUI实现缩放循环拖动卡牌展示效果

    Unity3D UGUI实现缩放循环拖动卡牌展示效果

    这篇文章主要为大家详细介绍了Unity3D UGUI实现缩放循环拖动展示卡牌效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    诗远3662022-03-11
  • C#C# 后台处理图片的几种方法

    C# 后台处理图片的几种方法

    本篇文章主要介绍了C# 后台处理图片的几种方法,非常具有实用价值,需要的朋友可以参考下。...

    IT小伙儿10162021-12-08