Windows 和 C++:extern 和 __declspec(dllimport)

问题描述 投票:0回答:1

extern
__declspec(dllimport)
之间有什么区别/关系?我发现有时需要两者都使用,有时一个就足够了。

我说得对吗:

  1. extern
    用于静态链接库,
  2. __declspec(dllimport)
    用于DLL(动态链接库),
  3. 两者对于各自类型的链接实际上执行相同的工作,
  4. 当您使用导入库(有助于链接 dll 的小 .lib 文件)时,您需要同时使用两者吗?
c++ windows dll linker
1个回答
49
投票

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

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

__declspec(dllimport)
表示将从 DLL 导入符号。在编译使用 DLL 的代码时使用它。

由于在编译 DLL 本身以及将使用 DLL 的客户端代码时通常使用相同的头文件,因此通常定义一个宏,在编译 DLL 时解析为

__declspec(dllexport)
,在编译时解析为
__declspec(dllimport)
它的客户端,就像这样:

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

回答您的具体问题:

  1. 是的,对于静态库来说,单独
    extern
    就足够了。
  2. 是的 - 并且声明还需要
    extern
    请参阅此处的解释)。
  3. 不完全是——见上文。
  4. 您并不严格需要带有
    extern
    __declspec(dllimport)
    (请参阅上面链接的说明),但由于您通常会使用相同的头文件,因此您已经在其中有了
    extern
    ,因为它是编译DLL时需要。
© www.soinside.com 2019 - 2024. All rights reserved.