extern
表示实体具有外部链接,即在其翻译单元(C或CPP文件)之外可见。这意味着将在对象文件中放置相应的符号,因此,如果将该对象文件作为静态库的一部分,它也将可见。然而,
外部的
本身并不意味着一旦对象文件成为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
要回答您的特定问题:
-
对,
外部的
单独使用静态库就足够了。
-
是的--而且声明还需要
外部
(
see explanation here
)
-
不完全——见上文。
-
你完全不需要
外部的
用一个
_ declspec(dllimport)
(参见上面链接的解释),但是由于您通常使用相同的头文件,因此您已经拥有了
外部的
因为编译dll时需要它。