c++中.dll与.lib文件的生成与使用的详解

 

 

 

 

两种库:

•  包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
•  包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
共有两种链接方式:

•  动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
•  静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。

--------------------------------------------------------------------------------

两种文件的区别

--------------------------------------------------------------------------------

使用lib需注意两个文件:

•.h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
•.LIB文件。

使用dll需注意三个文件:

•.h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
•.LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。
•dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。

 

生成步骤:

1.制作dll文件 
 vs2008中,File > New Project > Other Language > Win32 > Win32 Console Application. 输入项目名称:MyDll。点击【OK】,【Next】,选择dll单选按钮,完成。
 vs2008会自动生成一些代码,不用管它。创建MyDll.h,代码如下 
 MyDll.h 为了提高可用性,写了可回带值的函数供参考 
 Cpp代码  收藏代码 
 //MyDLL.h  
 extern "C" _declspec(dllexport) int Max(int a, int b);  
 extern "C" _declspec(dllexport) int Min(int a, int b);  
 extern "C" _declspec(dllexport) bool cim2scada(char* cimId, char** scadaId);
 
 创建MyDll.cpp 
 Cpp代码  收藏代码 
 // MyDll.cpp : Defines the exported functions for the DLL application.  
 //  
 #include "stdafx.h"  
 #include"MyDll.h"  
 #include <iostream>  
 
 int Max(int a, int b)  
 {  
 if(a>=b)return a;  
 else  
 return b;  
 }  
 int Min(int a, int b)  
 {  
 if(a>=b)return b;  
 else  
 return a;  
 }  
 
 bool cim2scada(char* cimId, char** scadaId){  
 char *result;  
 if(cimId == NULL){  
 printf("空指针!");  
 return false;  
 }else if(strlen(cimId) == 0){  
 printf("cimId无值!");  
 return false;  
 }  
 
 if(strcmp(cimId, "aaaaaa") == 0){  
 result = "1000";  
 }else if(strcmp(cimId, "bbbbbb") == 0){  
 result = "2000";  
 }  
 *scadaId = result;  
 printf("fun scadaId:%s\n", *scadaId);  
 return true;  
 }  
 
 编译一下,到工程的DEBUG目录,就可以找到MyDll.dll文件 
2.创建测试程序  --- 动态加载DLL

 vs2008中,File > New Project > Other Language > Win32 > Win32 Console Application. 输入项目名称:DllTest。点击【OK】,【Next】,选择console单选按钮,去掉“预编译头”默认勾选项,完成。
 Cpp代码  收藏代码 
 #include "windows.h"  
 #include <iostream>  
 
 void main(){  
 typedef int(*pMax)(int a, int b);  //定义个函数指针pMax指针指向int XX(int  a, int b)这样一个类型的函数
 typedef int(*pMin)(int a, int b);  
 typedef bool(*pcim2scada)(char* cimid, char** scada);  
 HINSTANCE HDLL;  
 HDLL=LoadLibrary(L"MyDll.dll");//加载动态链接库MyDll.dll文件;  
 pMax Max=(pMax)GetProcAddress(HDLL,"Max");  
 pMin Min=(pMin)GetProcAddress(HDLL,"Min");  
 pcim2scada cim2scada=(pcim2scada)GetProcAddress(HDLL,"cim2scada");  
 int a = Max(5, 12);  
 
 char cimId[] = "aaaaaa";  
 char * scadaId = "";  
 bool b = cim2scada(cimId, &scadaId);  
 
 printf("Max结果为%d",a);  
 printf("cimId:%s, scadaId:%s", cimId, scadaId);  
 FreeLibrary(HDLL);//卸载MyDll.dll文件;  
 }  
 
 编译一下 
 拷贝MyDll.dll文件到DllTest项目的Debug目录下 
 打开一个控制台(cmd),进入DllTest > Debug目录,运行DllTest.exe 
 输出结果: 
 Cpp代码  收藏代码 
 fun scadaId : 1000  
 Max结果为12  
 cimId:aaaaaa, scadaId:1000  

=====================================================================================================
这里总结一下vs2008下创建dll并使用dll导出函数的方法,当然方法还有很多,找出一个自己比较习惯的方法就好! 
一:生成DLL 
1:创建DLL工程 

 文件->新建->项目->visual c++->win32->win32控制台应用程序(win32项目也可以) 
 填写项目名称MyDLL->确定->下一步->DLL(附加选项 对空项目打钩)->完成。 
 到这里DLL工程就创建完毕了,下面新建两个文件MyDLL.cpp和MyDLL.h。 
 MyDLL.cpp内容如下: 

 #include <iostream> 
 using namespace std; 
 #include "MyDLL.h" 
 
 int Add(int &a,int &b) 
 { 
 return a+b;  
 } 

 MyDLL.h内容如下:  

 #pragma once 
 #define DLL_EXPORT __declspec(dllexport) 
 extern "C" DLL_EXPORT int Add(int &a,int &b); 
 点击生成,则dll文件就生成了,vs2008不能直接生成lib文件,这个时候就需要我们在建立dll工程的时候 再新建一个def文件,默认生成然后重新生成就能够得到lib文件了

2:调用DLL文件导出的接口函数 ----静态加载DLL

 vs2008这个IDE非常好用,我们这里玩一下,在上面创建的DLL工程中,再新建一个项目来直接调用DLL导出函数。 
 右键解决方案->添加->新建项目->建立一个空的常规工程 testMyDLL,下面新建两个文件testMyDLL.cpp和testMyDLL.h 

testMyDLL.cpp内容如下: 


//静态加载DLL需要把生成DLL的时候产生的LIB文件跟DLL文件还有头文件一起放在需要调用的工程中,这样就可以直接使用DLL中的函数。

 

 #include "testMyDLL.h" 
 #pragma comment(lib,"..\\debug\\MyDLL.lib") 
 #include <iostream> 
 using namespace std; 
 
 int main() 
 { 
 int a =3; 
 int b =2; 
 cout<<Add(a,b)<<endl; 
 
 getchar(); 
 } 

testMyDLL.h内容如下: 

 #pragma once 
 #define DLL_EXPORT __declspec(dllexport) 
 
 extern "C" DLL_EXPORT int Add(int &a,int &b); 
这里需要注意testMyDLL.cpp文件中调用lib的这句话: 

 #pragma comment(lib,"..\\debug\\MyDLL.lib") 

这里需要指明lib所在的文件夹,当然我们也可以在生成dll的MyDLL工程中,指定lib和dll文件的输出路径,直接到testMyDLL工程下。

参考:

https://blog.csdn.net/howard_liu1314/article/details/7862326 

https://www.cnblogs.com/lishennan/p/5053115.html

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值