使用__declspec(dllexport)/(dllimport)关键字
在头文件中宏定义
#ifndef DLL_EXT_API
#ifdef APPEXPORT
#define DLL_EXT_API __declspec(dllexport)
#else
#define DLL_EXT_API __declspec(dllimport)
#endif
#endif
注APPEXPORT定义在了
宏定义解读
如果未定义DLL_EXT_API且定义了APPEXPORT则将DLL_EXT_API定义为__declspec(dllexport)否则定义为__declspec(dllimport)
如此写法的巧妙之处在于,当跨工程使用该头文件时,由于使用的工程配置中不会定义APPEXPORT,此时,所有声明了DLL_EXT_API的函数则从原本的export变成了import
例子
头文件
extern DLL_EXT_API void YourFun(XXX);
cpp文件中按照正常函数写即可
在.def文件中声明
若工程为DLL项目,则可以在工程名对应的.def中申明需要跨dll调用的函数,使之成为全局。
此时在头文件中则不用对全局函数做任何申明,此种写法较为古旧,适用于C语言。
在接口类中创建静态成员函数
本质上也是使用__declspec(dllexport)/(dllimport)关键字,此时不直接对函数进行申明,而是对接口类进行申明
例子
>#ifndef DLL_EXT_API
#ifdef APPEXPORT
#define DLL_EXT_API __declspec(dllexport)
#else
#define DLL_EXT_API __declspec(dllimport)
#endif
#endif
class DLL_EXT_API CYourgInterface
{
protected:
CYourgInterface() {}
~CYourgInterface() {}
public:
static void YourFun(XXX);
};
在其他dll中直接通过CYourgInterface::YourFun即可调用该函数