Windows&C++:extern&__ declspec(dllimport)

lio*_*ori 22 c++ windows dll linker

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

我是对的吗

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

Mar*_*n B 35

extern表示实体具有外部链接,即在其翻译单元(C或CPP文件)之外可见.这意味着相应的符号将被放置在目标文件中,因此如果该目标文件是静态库的一部分,它也将是可见的.但是,extern一旦目标文件成为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
Run Code Online (Sandbox Code Playgroud)

回答您的具体问题:

  1. 是的,extern单独就足够了静态库.
  2. 是的 - 声明也需要extern(见这里的解释).
  3. 不完全 - 见上文.
  4. 你并不严格需要externwith a __declspec(dllimport)(参见上面的解释),但由于你通常会使用相同的头文件,extern因此在编译DLL时需要使用相同的头文件.

  • MSVS 2005文档已淘汰,并且“(请参阅此处的说明)”链接指向一些已淘汰的文档。是否有可能在最新版本的MSVS中将链接更新为等效链接? (2认同)