代码之家  ›  专栏  ›  技术社区  ›  liori

WINDOWS+C++:Extn&Oy-DelScript(DLLimPART)

  •  19
  • liori  · 技术社区  · 14 年前

    “extern”和“uuu declspec(dllimport)”之间的区别/关系是什么?我发现有时两者都需要,有时一个就足够了。

    我说得对吗:

    1. “extern”用于静态链接库,
    2. “uu declspec(dllimport)”用于dll(动态链接库),
    3. 两者对各自类型的链接实际上做了相同的工作,
    4. 在使用导入库(有助于与dll链接的小.lib文件)时,需要同时使用两者吗?
    1 回复  |  直到 14 年前
        1
  •  31
  •   Martin B    14 年前

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

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

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

    由于编译dll本身以及将使用dll的客户端代码时通常都使用相同的头文件,因此通常定义一个宏来解析为 _ declspec(dllexport) 编译dll和 _ declspec(dllimport) 编译客户机时,如:

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

    要回答您的特定问题:

    1. 对, 外部的 单独使用静态库就足够了。
    2. 是的--而且声明还需要 外部 ( see explanation here )
    3. 不完全——见上文。
    4. 你完全不需要 外部的 用一个 _ declspec(dllimport) (参见上面链接的解释),但是由于您通常使用相同的头文件,因此您已经拥有了 外部的 因为编译dll时需要它。