窗户&C++:extern &__declspec(dllimport)
extern"和__declspec(dllimport") 之间的区别/关系是什么?我发现有时候需要两个都用,有时候一个就够了.
What is the difference/relationship between "extern" and "__declspec(dllimport")? I found that sometimes it is necessary to use both of them, sometimes one is enough.
我说得对吗:
- extern"用于静态链接库,
- "__declspec(dllimport)" 用于 DLL(动态链接库),
- 对于各自类型的链接,两者实际上都做同样的工作,
- 当您使用导入库(有助于与 dll 链接的小型 .lib 文件)时,您需要同时使用两者吗?
推荐答案
extern
表示实体具有外部链接,即在其翻译单元(C 或 CPP 文件)之外可见.这意味着相应的符号将被放置在目标文件中,因此如果该目标文件成为静态库的一部分,它也将是可见的.但是,extern
本身并不意味着一旦目标文件成为 DLL 的一部分,该符号也将可见.
extern
means that the entity has external linkage, i.e. is visible outside its translation unit (C or CPP file). The implication of this is that a corresponding symbol will be placed in the object file, and it will hence also be visible if this object file is made part of a static library. However, extern
does not by itself imply that the symbol will also be visible once the object file is made part of a DLL.
__declspec(dllexport)
表示应该从 DLL 导出符号(如果它确实是 DLL 的一部分).在编译进入 DLL 的代码时使用.
__declspec(dllexport)
means that the symbol should be exported from a DLL (if it is indeed made part of a DLL). It is used when compiling the code that goes into the DLL.
__declspec(dllimport)
表示将从 DLL 导入符号.在编译使用 DLL 的代码时使用.
__declspec(dllimport)
means that the symbol will be imported from a DLL. It is used when compiling the code that uses the DLL.
因为通常在编译 DLL 本身以及将使用该 DLL 的客户端代码时使用相同的头文件,所以习惯上定义一个解析为 __declspec(dllexport)
的宏编译 DLL 时,__declspec(dllimport)
编译其客户端时,如下所示:
Because the same header file is usually used both when compiling the DLL itself as well as the client code that will use the DLL, it is customary to define a macro that resolves to __declspec(dllexport)
when compiling the DLL and __declspec(dllimport)
when compiling its client, like so:
#if COMPILING_THE_DLL
#define DLLEXTERN __declspec(dllexport)
#else
#define DLLEXTERN __declspec(dllimport)
#endif
回答您的具体问题:
- 是的,对于静态库,仅
extern
就足够了. - 是的――声明还需要一个
extern
(参见此处的说明). - 不完全――见上文.
- 您并不严格需要带有
__declspec(dllimport)
的extern
(请参阅上面链接的解释),但因为您通常会使用相同的标头文件,您将在其中拥有extern
,因为在编译 DLL 时需要它.
- Yes,
extern
alone is sufficient for static libraries. - Yes -- and the declaration also needs an
extern
(see explanation here). - Not quite -- see above.
- You don't strictly need the
extern
with a__declspec(dllimport)
(see explanation linked to above), but since you'll usually be using the same header file, you'll already have theextern
in there because it's needed when compiling the DLL.
相关文章