Windows& C ++:extern& __declspec(dllimport的)

时间:2010-02-18 11:45:32

标签: c++ windows dll linker

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

我是对的:

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

1 个答案:

答案 0 :(得分:32)

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

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

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

因为在编译DLL本身以及将使用DLL的客户端代码时通常都使用相同的头文件,所以通常在编译DLL和{时定义一个解析为__declspec(dllexport)的宏。 {1}}在编译客户端时,如下所示:

__declspec(dllimport)

回答您的具体问题:

  1. 是的,仅#if COMPILING_THE_DLL #define DLLEXTERN __declspec(dllexport) #else #define DLLEXTERN __declspec(dllimport) #endif 就足够了静态库。
  2. 是的 - 声明还需要externsee explanation here)。
  3. 不完全 - 见上文。
  4. 您并不一定需要extern extern(请参阅上面的解释),但由于您通常会使用相同的头文件,因此您已经拥有{ {1}}因为在编译DLL时需要它。