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