我不能强调这一点,C++ 编译器看不到头文件,在预处理器完成后,只有一个大源文件(也称为编译单元)。所以严格来说,您不需要标头来从 dll 导出此函数。您需要的是某种形式的条件编译来导出正在编译的 dll 中的函数并将其导入客户端代码中。
通常这是通过宏和头文件的组合来完成的。您创建了一个名为 MYIMPORTEXPORT 的宏,并通过使用宏条件语句使其像 dll 中的 __declspec ( dllexport ) 和客户端代码中的 __declspec ( dllimport ) 一样工作。
在文件 MYIMPORTEXPORT.h
#ifdef SOME_CONDITION
#define MYIMPORTEXPORT __declspec( dllexport )
#else
#define MYIMPORTEXPORT __declspec( dllimport )
#endif
在文件 MyHeader.h
#include <MyImportExport.h>
MYIMPORTEXPORT public int calculateSquare(int num)
{
return num*num;
}
在 dll .cpp 文件中
#define SOME_CONDITION
#include <MyHeader.h>
在客户端代码 .cpp 文件中
#include <MyHeader.h>
当然,您还需要向链接器发出信号,表明您正在使用/DLL 选项构建 dll 。
构建过程还将生成一个 .lib 文件,这是一个静态库 - 在这种情况下称为存根 - 客户端代码需要链接到它,就好像它正在链接到一个真正的静态库一样。运行客户端代码时会自动加载 dll。当然 dll 需要操作系统通过其查找机制找到,这意味着您不能将 dll 放在任何地方,而是放在特定位置。这里有更多内容。
dumpbin是一个非常方便的工具,可以查看您是否从 dll 中导出了正确的函数,以及客户端代码是否正确导入。分别使用 /EXPORTS 和 /IMPORTS 运行它。