__declspec(dllimport)真的意味着什么?
我看到了这样的Qt源代码:
class Q_CORE_EXPORT QBasicAtomicInt { public: ... };
哪个Q_CORE_EXPORT
macros定义如下:
define Q_DECL_IMPORT __declspec(dllimport)
那么__declspec(dllimport)
是什么意思?
__declspec
是Microsoft特有的属性,允许您指定存储级别的信息。
(Nitpicker's Corner:但是,现在还有一些编译器供应商(如GCC)支持这种语言扩展,以便与针对微软编译器编写的已安装的代码库兼容,甚至还提供了额外的存储类属性。
其中两个可以指定的存储类属性是dllimport
和dllexport
。 这些向编译器指示函数或对象是从DLL导入或导出(分别)。
更具体地说,它们定义了DLL的客户端接口,而不需要模块定义( .DEF
)文件。 大多数人发现使用这些语言扩展比创buildDEF文件要容易得多。
出于显而易见的原因, __declspec(dllimport)
和__declspec(dllexport)
通常是相互配对的。 您使用dllexport
标记从DLL导出的符号,并使用dllimport
将导出的符号导入到另一个文件中。
正因为如此,并且因为在编译DLL和使用DLL接口的客户端代码中通常使用相同的头文件,所以定义一个在编译时自动parsing为适当的属性说明符的macros是一种常见模式。 例如:
#if COMPILING_DLL #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __declspec(dllimport) #endif
然后标记应该使用DLLEXPORT
导出的所有符号。
据推测,这就是Q_CORE_EXPORT
macros,parsing为Q_DECL_IMPORT
或Q_DECL_EXPORT
。
__declspec(dllimport)
是一个存储类说明符,它告诉编译器在外部DLL中定义了函数或对象或数据types。
函数或对象或数据types是从DLL中导出的,具有相应的__declspec(dllexport)
。
这意味着函数的定义是在一个dynamic库中。 有关更多详细信息和示例,请参阅文档 。