同一个解决方案中,如果要在某个DLL工程中封装一些功能,则存在一个导入导出函数或类的问题,导出要用dllexport,导入时则用dllimport。如果不采用预编译指令,可能需要写两份头文件,一份用dllexport声明函数供dll自己用,另一份则用dllimport声明供dll的客户端(或叫宿主)程序用。
这样会很不爽,如果改动,就得两个都改,使用条件编译指令,结合适当的宏定义就可以避免这种麻烦。
1、把如下条件编译指令加在.h文件最前边
//控制是在Dll中使用,还是在客户端用
#ifdef _EXPORTING
#define My_DECLSPEC __declspec(dllexport) // 导出
#else
#define My_DECLSPEC __declspec(dllimport) // 导入
#endif
2、然后用这样的方式在.h中定义函数或类
class My_DECLSPEC MyClass
{
private:
int i, j;
public:
setupI();
setupj();
}
My_DECLSPEC void func1();
3、在对应的.cpp中最开始增加宏定义就使dll中使用dllexport
//定义DLL中的导出C++类
#define _EXPORTING
4、当把该.h文件发给dll使用者时,他不定义_EXPORTING就会采用dllimport定义。
这样就达到共享.h文件的目的。