__declspec(dllimport)真的意味着什么?

我看到了这样的Qt源代码:

class Q_CORE_EXPORT QBasicAtomicInt { public: ... }; 

哪个Q_CORE_EXPORTmacros定义如下:

 define Q_DECL_IMPORT __declspec(dllimport) 

那么__declspec(dllimport)是什么意思?

__declspec是Microsoft特有的属性,允许您指定存储级别的信息。
(Nitpicker's Corner:但是,现在还有一些编译器供应商(如GCC)支持这种语言扩展,以便与针对微软编译器编写的已安装的代码库兼容,甚至还提供了额外的存储类属​​性。

其中两个可以指定的存储类属​​性是dllimportdllexport 。 这些向编译器指示函数或对象是从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_EXPORTmacros,parsing为Q_DECL_IMPORTQ_DECL_EXPORT

__declspec(dllimport)是一个存储类说明符,它告诉编译器在外部DLL中定义了函数或对象或数据types。

函数或对象或数据types是从DLL中导出的,具有相应的__declspec(dllexport)

这意味着函数的定义是在一个dynamic库中。 有关更多详细信息和示例,请参阅文档 。