c++ - dllimport 和 dllexport 之间的链接

标签 c++ windows dll

我有一些关于 Windows 中 C++ 中的 dllexport、dllimport 的问题。假设我有一些 module.cppmodule.h,它们使用 dllexport 导出函数。假设我还有 moduleWrapper.cppmoduleWrapper.h,它使用 dllimportmodule.cpp 导入函数.

有人能解释一下为什么我会错过在我的 moduleWrapper.cppmoduleWrapper.h 中编写 #include module.h 的原因吗?我不明白链接器如何知道 module.cpp 中函数的地址,在此先感谢您的任何解释

最佳答案

据我了解,您在 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,而这些文件恰好正在使用 header 。

关于c++ - dllimport 和 dllexport 之间的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6975578/

相关文章:

windows - 如何在 Windows 上执行类似 "sed -"的操作?

c++ - boost directory_iterator是否在Windows上按字母顺序访问文件和文件夹

c# - 如何在 Visual C++ 控制台应用程序中添加 C# dll?

java - JNI - 线程和 jobject 的问题

c++ - 以函数方式组合谓词

C++ header-only 模板库

c++ - 如何在 C++ 中模拟指定的键盘击键?

c++ - 扩展类而不更改其名称

java - 以可移植的方式以编程方式打开文档

c# - 有没有办法让 DLL 注册到 HKLM?