“extern”和“__declspec(dllimport”)之间有什么区别/关系?我发现有时候有必要同时使用它们,有时候就足够了 .
我是对的吗
"extern"适用于静态链接库,
"__declspec(dllimport)"适用于DLL(动态链接库),
对于各自的链接类型实际上都是相同的工作,
你需要在使用导入库时使用两者(小的.lib文件有助于与dll链接)?
extern 表示该实体具有外部链接,即在其翻译单元(C或CPP文件)之外可见 . 这意味着相应的符号将被放置在目标文件中,因此如果该目标文件是静态库的一部分,它也将是可见的 . 但是, extern 本身并不意味着一旦目标文件成为DLL的一部分,该符号也将可见 .
extern
__declspec(dllexport) 表示应该从DLL导出符号(如果它确实是DLL的一部分) . 在编译进入DLL的代码时使用它 .
__declspec(dllexport)
__declspec(dllimport) 表示将从DLL导入符号 . 在编译使用DLL的代码时使用它 .
__declspec(dllimport)
因为在编译DLL本身以及将使用DLL的客户端代码时通常都使用相同的头文件,所以通常在编译DLL时定义一个解析为 __declspec(dllexport) 的宏,并在编译其客户端时定义 __declspec(dllimport) ,如此:
#if COMPILING_THE_DLL #define DLLEXTERN __declspec(dllexport) #else #define DLLEXTERN __declspec(dllimport) #endif
回答您的具体问题:
是的, extern 单独就足以用于静态库 .
是 - 并且声明还需要 extern (see explanation here) .
不完全 - 见上文 .
你并不严格需要 extern 和 __declspec(dllimport) (参见上面链接的解释),但是因为你已经拥有 extern 因为在编译DLL时需要 extern .
1 回答
extern
表示该实体具有外部链接,即在其翻译单元(C或CPP文件)之外可见 . 这意味着相应的符号将被放置在目标文件中,因此如果该目标文件是静态库的一部分,它也将是可见的 . 但是,extern
本身并不意味着一旦目标文件成为DLL的一部分,该符号也将可见 .__declspec(dllexport)
表示应该从DLL导出符号(如果它确实是DLL的一部分) . 在编译进入DLL的代码时使用它 .__declspec(dllimport)
表示将从DLL导入符号 . 在编译使用DLL的代码时使用它 .因为在编译DLL本身以及将使用DLL的客户端代码时通常都使用相同的头文件,所以通常在编译DLL时定义一个解析为
__declspec(dllexport)
的宏,并在编译其客户端时定义__declspec(dllimport)
,如此:回答您的具体问题:
是的,
extern
单独就足以用于静态库 .是 - 并且声明还需要
extern
(see explanation here) .不完全 - 见上文 .
你并不严格需要
extern
和__declspec(dllimport)
(参见上面链接的解释),但是因为你已经拥有extern
因为在编译DLL时需要extern
.