关于Visual C ++:dllexport和dllimport有什么区别?

关于Visual C ++:dllexport和dllimport有什么区别?

What is the difference between dllexport and dllimport?

我只是在寻找这两者之间区别的简单明了的解释。 MSDN在这里不会涉及很多细节。


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

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


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

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

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


两种不同的用例:

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

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

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


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

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


推荐阅读