我对Windows中的C ++中的dllexport,dllimport有一些疑问。我们假设我有module.cpp
和module.h
使用dllexport
导出函数。我们假设我还moduleWrapper.cpp
和moduleWrapper.h
使用module.cpp
从dllimport
导入函数。
有人可以解释为什么我会错过在我的#include module.h
和moduleWrapper.cpp
中写moduleWrapper.h
。我无法理解链接器如何知道module.cpp中函数的地址,提前感谢任何解释
答案 0 :(得分:7)
根据我的理解,你在module.h中有这样的东西:
__declspec(dllexport) void f();
然后,你的moduleWrapper.cpp中有一个类似的声明:
__declspec(dllimport) void f();
它被视为函数声明,因此您删除了包含module.h的任何需要。通常的做法是将以下代码放在包含文件中:
#ifdef PROJECTNAME_EXPORTS // (the default macro in Visual Studio)
#define PROJECTAPI __declspec(dllexport)
#else
#define PROJECTAPI __declspec(dllimport)
#endif
然后在头文件中声明你的函数,如下所示:
PROJECTAPI void f();
这样,当您编译DLL时,它将转换为dllexport,并且在任何不属于您的DLL且恰好使用标头的文件中进行dllimport。