65

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

4

4 回答 4

90

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

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

于 2008-09-12T00:43:53.710 回答
57
  • __declspec(dllexport)告诉链接器您希望此对象可供其他 DLL 导入。它在创建其他人可以链接到的 DLL 时使用。

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

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

于 2008-09-12T00:41:42.747 回答
12

两种不同的用例:

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

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

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

于 2008-09-12T00:43:32.773 回答
10

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

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

于 2008-09-12T00:43:34.117 回答