C++知识点 生成与使用dll
1. Dll的导出1.创建空项目2.项目》属性》常规》配置类型 选择 动态库.dll3.写代码头文件mathTool.h#pragma once#ifdef MATH_API#define DLL_API __declspec(dllexport)#else#define DLL_API __declspec(dllimport)#endif//函数描述:对两个int变量进行求和。//返回值:求和
1. Dll的导出
1.创建空项目
2.项目》属性》常规》配置类型 选择 动态库.dll
3.写代码
头文件
mathTool.h
#pragma once
#ifdef MATH_API
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
//函数描述:对两个int变量进行求和。
//返回值:求和后的int值
DLL_API int add(int a, int b);
__declspec(dllexport)的作用是将函数接口导出到DLL的导出列表里面。导出到dll的导出列表以后,别的项目才能根据函数名去dll中找到这个函数的位置。
头文件中加了一个宏定义MATH_API,其作用见步骤4。
具体实现
mathTool.cpp
int add(int a, int b)
{
return a + b;
}
4…项目》属性》C/C++》预处理器》预处理器定义 添加宏定义MATH_API
这里为什么要加宏定义MATH_API呢?
首先,dll的导出和导入的关键字区分在于__declspec()的括号里面是dllexport(导出)还是dllimport(导入)。在本项目中我需要告诉VS这个函数是导出的,在其他项目中需要告诉VS这个函数是从别的dll里面导入的。但是不管哪个项目,使用的都是math.h这个头文件,这时宏定义作为编译开关的作用就体现出来了。
在Demo1的项目生成中,由于我们定义了MATH_API的宏定义,所以DLL_API是被定义为__declspec(dllexport)。在其他项目中引用头文件math.h时,其他项目中并没有定义MATH_API的宏定义,所以DLL_API被定义为__declspec(dllimport)。这样就做到了同一份header不同的声明。
5.添加def文件
6.def文件书写
def文件的作用:
指定导出函数,并告知编译器不要以修饰后的函数名作为导出函数名,而以指定的函数名导出函数(比如有函数func,让编译器处理后函数名仍为func)。这样,就可以避免不同编译器对函数名不同的处理方式而引起的链接错误。
def文件格式如下:
LIBRARY XX(dll名称这个并不是必须的,但必须确保跟生成的dll名称一样)
EXPORTS
[函数名] @ [函数序号]
export.def
LIBRARY
EXPORTS
add @ 1
同时我这里把目标文件名改成了mathTool,之前是$(ProjectName)
以上步骤完成后,点击生成,即可得到mathTool.dll和mathTool.lib。
注意:如果没有添加.def文件,将只会生成mathTool.dll文件,不会生成mathTool.lib文件。
2. Dll的引用
1.分别创建3个文件夹3rd、include、lib
并将mathTool.dll、mathTool.h、mathTool.lib分别拷贝到这3个文件夹中。
2.项目》属性》C/C++》附加包含目录 添加刚创建的include文件夹
2.项目》属性》链接器》常规》附加包含目录 添加刚创建的lib文件夹
3.项目》属性》链接器》输入》附加依赖项 添加mathTool.lib
4.项目》属性》生成事件》生成后事件》命令行
添加
xcopy "$(ProjectDir)3rd\mathTool.dll" "$(SolutionDir)$(Platform)\$(Configuration)\" /y
至此,即可使用dll中的函数。
main.cpp
#include <cstdio>
#include "mathTool.h"
int main(int argc, char* argv[])
{
const int result = add(10, 90);
printf("计算后的结果为:%d", result);
return 1;
}
总结:
1.项目》属性》C/C++》附加包含目录 添加include
是为了方便代码中查找头文件 ,可以直接#include "mathTool.h"而不用#include “include/mathTool.h”
2.项目》属性》链接器》常规》附加包含目录 添加刚创建的lib文件夹
是为了链接器链接时去搜索我们创建的lib文件夹
3.项目》属性》链接器》输入》附加依赖项 添加mathTool.lib
2中只是定义了搜索lib文件夹,但具体哪个文件在附件依赖项来定义
4.项目》属性》生成事件》生成后事件》命令行
是为了自动拷贝mathTool.dll到程序生成目录,而不用人为手动拷贝
5.头文件、lib文件、dll文件说明
•.h头文件
包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
•.LIB文件
是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。
•dll文件
真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。
3 参考文章
更多推荐
所有评论(0)