Windows& C ++:extern& __declspec(dllimport的) [英] Windows & 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" is for statically linked libraries,
- "__declspec(dllimport)" is for DLL (dynamically linked libraries),
- both do actually the same job for their respective type of linking,
- you need to use both when you use import libraries (small .lib files that help linking with dll)?
推荐答案
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通常在编译DLL时定义一个解析为 __ declspec(dllexport)
的宏, __ 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
(请参阅这里的解释)。 - 不完全看到上面。
- 您不必严格要求
extern
与__ declspec(dllimport)
(请参阅上面链接的说明),但是由于您通常会使用相同的标题文件,您将已经有$ code> 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.
这篇关于Windows& C ++:extern& __declspec(dllimport的)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!