首页 文章

Windows&C:extern&__ declspec(dllimport)

提问于
浏览
19

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

我是对的吗

  • "extern"适用于静态链接库,

  • "__declspec(dllimport)"适用于DLL(动态链接库),

  • 对于各自的链接类型实际上都是相同的工作,

  • 你需要在使用导入库时使用两者(小的.lib文件有助于与dll链接)?

1 回答

  • 31

    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
    

    回答您的具体问题:

    • 是的, extern 单独就足以用于静态库 .

    • 是 - 并且声明还需要 externsee explanation here) .

    • 不完全 - 见上文 .

    • 你并不严格需要 extern__declspec(dllimport) (参见上面链接的解释),但是因为你已经拥有 extern 因为在编译DLL时需要 extern .

相关问题