Mar*_*n B 35
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
Run Code Online (Sandbox Code Playgroud)
回答您的具体问题:
extern
单独就足够了静态库.extern
(见这里的解释).extern
with a __declspec(dllimport)
(参见上面的解释),但由于你通常会使用相同的头文件,extern
因此在编译DLL时需要使用相同的头文件.