一般地,我们在新建一个win32的动态链接库(DLL)时,会采取如下的方式的来编写导出接口文件(.h)。
#pragma once
#ifndef API_EXPORT
#define DECL_API extern "C" __declspec(dllimport)
#else
#define DECL_API extern "C" __declspec(dllexport)
#endif
DECL_API int Add(int a, int b);
如上代码,主要使用了一组预编译宏。这样设计的好处是,可以复用这个头文件。复用的方法是:
1)在客户端,正常包含该头文件即可。不要定义“API_EXPORT”,这个宏。这样客户端编译时将把所有接口看作导入函数。
2)在DLL端,接口函数的实现文件中(.cpp),需要定义宏“API_EXPORT”。这样,DLL编译时将把接口函数当作导出函数。
问题:
在接口函数的实现文件中,需要非常小心宏“API_EXPORT”的定义行与接口头文件包含代码行的位置关系。否则容易导致编译错误,特别是用VS的预编译头文件后。
举例:
用VS2015(其他版本也可以)新建一个名为“Export”的win32 DLL工程(其他