c++ - Windows & C++ : extern & __declspec(dllimport)

标签 c++ windows dll linker

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

我说的对吗:

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

最佳答案

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

回答您的具体问题:

  1. 是的,仅 extern 就足以用于静态库。
  2. 是的——而且声明还需要一个extern (see explanation here)。
  3. 不完全——见上文。
  4. 您并不严格需要带有 __declspec(dllimport)extern(请参阅上面链接的说明),但由于您通常会使用相同的 header extern 文件,因为在编译 DLL 时需要它。

关于c++ - Windows & C++ : extern & __declspec(dllimport),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2288293/

相关文章:

c++ - Visual C++ 中的容错 DLL 使用

c++ - 包含 map /内容错误的 COM 对象 (0)

c++ - 在 Linux 上使用 libserial 从串行端口读取额外字符

c++ - Qt LanguageChange 事件 - 找出新的语言

c++ - 无论如何,当临时对象被销毁时,为什么还需要一个移动构造函数?

c++ - 具有高效 "remove"函数的数据结构

c# - 我怎样才能用 C# 延迟?

java - 为什么我在 Java 中从 Windows 命令行得到\r\r\n (CR CR LF)?

dll - 与 ffmpeg 共享构建链接

windows - 如何通过chrome_proxy.exe打开具有特定URL的chrome应用程序?