【问题标题】:Windows & C++: extern & __declspec(dllimport)Windows & C++: extern & __declspec(dllimport)
【发布时间】:2011-01-18 07:11:42
【问题描述】:

“extern”和“__declspec(dllimport”) 之间有什么区别/关系?我发现有时需要同时使用它们,有时一个就足够了。

我说的对吗:

  1. “extern”用于静态链接库,
  2. “__declspec(dllimport)”用于 DLL(动态链接库),
  3. 对于各自的链接类型,两者实际上都执行相同的工作,
  4. 在使用导入库(有助于与 dll 链接的小 .lib 文件)时,您需要同时使用这两者吗?

【问题讨论】:

    标签: c++ windows dll linker


    【解决方案1】:

    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 (see explanation here)。
    3. 不完全——见上文。
    4. 您并不严格需要带有__declspec(dllimport) 的extern(参见上面链接的解释),但由于您通常使用相同的头文件,因此您已经拥有extern因为在编译 DLL 时需要它。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2013-07-29
    • 2020-04-30
    • 2012-07-14
    • 2022-01-05
    相关资源
    最近更新 更多