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
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 “KaTeX parse error: Undefined control sequence: \mathTool at position 16: (ProjectDir)3rd\?m?a?t?h?T?o?o?l?.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 参考文章
|