dllexport 和 dllimport 有啥区别?

Posted

技术标签:

【中文标题】dllexport 和 dllimport 有啥区别?【英文标题】:What is the difference between dllexport and dllimport?dllexport 和 dllimport 有什么区别? 【发布时间】:2010-09-08 15:36:43 【问题描述】:

我只是想对这两者之间的区别进行简单、简洁的解释。 MSDN 在这里没有详细介绍。

【问题讨论】:

【参考方案1】:

__declspec( dllexport ) - 如此标记的类或函数将从其内置的 DLL 中导出。如果您正在构建一个 DLL 并且需要一个 API,则需要使用此文件或单独的 .DEF 文件定义导出 (MSDN)。这很方便,因为它将定义保存在一个位置,但 .DEF 文件提供了更多选项。

__declspec( dllimport ) - 如此标记的类或函数将从 DLL 导入。这实际上不是必需的 - 您需要一个导入库 无论如何 以使链接器满意。但是当用dllimport 正确标记时,编译器和链接器有足够的信息来优化调用;没有它,您将获得到导入库中存根函数的正常静态链接,这会增加不必要的间接性。 ONT1ONT2

【讨论】:

关于不使用dllimport的后果的非常好的信息。【参考方案2】:

__declspec(dllexport) 告诉链接器您希望此对象可供其他 DLL 导入。在创建其他人可以链接的 DLL 时使用它。

__declspec(dllimport) 从 DLL 导入实现,以便您的应用程序可以使用它。

我只是一个新手 C/C++ 开发人员,所以也许有人比我有更好的解释。

【讨论】:

【参考方案3】:

两种不同的用例:

1) 您在 dll 中定义类实现。您希望另一个程序使用该类。在这里,您使用 dllexport 创建一个您希望 dll 公开的类。

2) 您正在使用 dll 提供的功能。您包括随 dll 提供的标头。这里header使用dllimport来引入当前程序要使用的实现。

通常在这两种情况下使用相同的头文件并定义一个宏。构建配置根据需要定义要导入或导出的宏。

【讨论】:

【参考方案4】:

Dllexport 用于将函数标记为已导出。您在 DLL 中实现该函数并将其导出,以便任何使用您的 DLL 的人都可以使用它。

Dllimport 则相反:它将函数标记为从 DLL 导入。在这种情况下,您只需声明函数的签名并将代码与库链接。

【讨论】:

以上是关于dllexport 和 dllimport 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

转载 __declspec(dllexport) 和__declspec(dllimport)

dllimport与dllexport作用与区别

C++:带有 dllimport/dllexport 的内联函数?

Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区

c语言 不允许 dllimport 函数 的定义 怎么办

[DllImport()] 可以处理静态 c 库吗