Windows& C ++:extern& __declspec(dllimport的) [英] Windows & C++: extern & __declspec(dllimport)

查看:164
本文介绍了Windows& C ++:extern& __declspec(dllimport的)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

extern和__declspec(dllimport)之间的区别/关系是什么?我发现有时候有必要使用这两个,有时一个就够了。

What is the difference/relationship between "extern" and "__declspec(dllimport")? I found that sometimes it is necessary to use both of them, sometimes one is enough.

我是对的:


  1. extern用于静态链接库,

  2. __ declspec(dllimport)用于DLL(动态链接库),

  3. 对于各自的链接类型实际上都是一样的,

  4. 当您使用导入库(有助于链接到dll的小型.lib文件)时,您需要使用)?

  1. "extern" is for statically linked libraries,
  2. "__declspec(dllimport)" is for DLL (dynamically linked libraries),
  3. both do actually the same job for their respective type of linking,
  4. you need to use both when you use import libraries (small .lib files that help linking with dll)?


推荐答案

extern 该实体具有外部链接,即在其翻译单元之外可见(C或CPP文件)。这意味着相应的符号将被放置在目标文件中,如果这个对象文件是静态库的一部分,它也将被看见。但是, extern 本身并不意味着一旦对象文件成为DLL的一部分,该符号也将可见。

extern means that the entity has external linkage, i.e. is visible outside its translation unit (C or CPP file). The implication of this is that a corresponding symbol will be placed in the object file, and it will hence also be visible if this object file is made part of a static library. However, extern does not by itself imply that the symbol will also be visible once the object file is made part of a DLL.

__ declspec(dllexport)表示符号应该从DLL导出(如果它确实是DLL的一部分)。在编译进入DLL的代码时使用它。

__declspec(dllexport) means that the symbol should be exported from a DLL (if it is indeed made part of a DLL). It is used when compiling the code that goes into the DLL.

__ declspec(dllimport)表示符号将从DLL导入。当编译使用该DLL的代码时使用它。

__declspec(dllimport) means that the symbol will be imported from a DLL. It is used when compiling the code that uses the DLL.

因为在编译DLL本身以及将使用的客户端代码时通常使用相同的头文件该DLL通常在编译DLL时定义一个解析为 __ declspec(dllexport)的宏, __ declspec(dllimport)编译客户端时,如下所示:

Because the same header file is usually used both when compiling the DLL itself as well as the client code that will use the DLL, it is customary to define a macro that resolves to __declspec(dllexport) when compiling the DLL and __declspec(dllimport) when compiling its client, like so:

#if COMPILING_THE_DLL
    #define DLLEXTERN __declspec(dllexport)
#else
    #define DLLEXTERN __declspec(dllimport)
#endif

回答你的具体问题:


  1. 是的, extern

  2. 是 - 并且声明也需要一个 extern 请参阅这里的解释)。

  3. 不完全看到上面。

  4. 您不必严格要求 extern __ declspec(dllimport)(请参阅上面链接的说明),但是由于您通常会使用相同的标题文件,您将已经有$ code> extern ,因为在编译DLL时需要。

  1. Yes, extern alone is sufficient for static libraries.
  2. Yes -- and the declaration also needs an extern (see explanation here).
  3. Not quite -- see above.
  4. You don't strictly need the extern with a __declspec(dllimport) (see explanation linked to above), but since you'll usually be using the same header file, you'll already have the extern in there because it's needed when compiling the DLL.

这篇关于Windows& C ++:extern& __declspec(dllimport的)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆